PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Requête efficace sur le dernier enregistrement avec Postgresql

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.