Jeśli nie chcesz zmieniać modelu danych, możesz użyć DISTINCT ON
aby pobrać najnowszy rekord z tabeli "b" dla każdego wpisu w "a":
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
Jeśli chcesz uniknąć „sortowania” w zapytaniu, dodaj indeks podobny do tego może pomóc, ale nie jestem pewien:
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
Alternatywnie, jeśli chcesz w jakiś sposób posortować rekordy z tabeli „a”:
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
Alternatywne podejścia
Jednak wszystkie powyższe zapytania nadal muszą odczytać wszystkie przywoływane wiersze z tabeli „b”, więc jeśli masz dużo danych, może to być po prostu zbyt wolne.
Możesz utworzyć nową tabelę, która będzie zawierała tylko najnowszy rekord „b” dla każdego a.id
-- lub nawet przenieść te kolumny do samej tabeli „a”.