Jika Anda tidak ingin mengubah model data Anda, Anda dapat menggunakan DISTINCT ON
untuk mengambil catatan terbaru dari tabel "b" untuk setiap entri di "a":
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
Jika Anda ingin menghindari "sort" dalam kueri, tambahkan indeks seperti ini mungkin membantu Anda, tetapi saya tidak yakin:
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
Atau, jika Anda ingin mengurutkan catatan dari tabel "a" dengan beberapa cara:
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
Pendekatan alternatif
Namun, semua kueri di atas masih perlu membaca semua baris yang direferensikan dari tabel "b", jadi jika Anda memiliki banyak data, mungkin masih terlalu lambat.
Anda dapat membuat tabel baru, yang hanya menyimpan catatan "b" terbaru untuk setiap a.id
-- atau bahkan pindahkan kolom tersebut ke tabel "a" itu sendiri.