Se você não quiser alterar seu modelo de dados, use
DISTINCT ON
para buscar o registro mais recente da tabela "b" para cada entrada em "a":SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
Se você quiser evitar uma "classificação" na consulta, adicionar um índice como este pode ajudá-lo, mas não tenho certeza:
CREATE INDEX b_id_date ON b (id, date DESC)
SELECT DISTINCT ON (b.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY b.id, b.date DESC
Alternativamente, se você quiser classificar os registros da tabela "a" de alguma forma:
SELECT DISTINCT ON (sort_column, a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY sort_column, a.id, b.date DESC
Abordagens alternativas
No entanto, todas as consultas acima ainda precisam ler todas as linhas referenciadas da tabela "b", portanto, se você tiver muitos dados, ainda poderá ser muito lento.
Você pode criar uma nova tabela, que contém apenas o registro "b" mais recente para cada
a.id
-- ou até mesmo mover essas colunas para a própria tabela "a".