Si vous ne souhaitez pas modifier votre modèle de données, vous pouvez utiliser DISTINCT ON
pour récupérer l'enregistrement le plus récent de la table "b" pour chaque entrée dans "a":
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
Si vous voulez éviter un "tri" dans la requête, l'ajout d'un index comme celui-ci pourrait t'aider, mais je ne suis pas sûr :
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
Sinon, si vous souhaitez trier les enregistrements de la table "a" d'une manière ou d'une autre :
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
Approches alternatives
Cependant, toutes les requêtes ci-dessus doivent encore lire toutes les lignes référencées du tableau "b", donc si vous avez beaucoup de données, il se peut que ce soit encore trop lent.
Vous pouvez créer une nouvelle table, qui ne contient que le dernier enregistrement "b" pour chaque a.id
-- ou même déplacer ces colonnes dans la table "a" elle-même.