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

Renvoie des enregistrements distincts sur une colonne mais triés par une autre colonne

DISTINCT ON

Si vous utilisez DISTINCT ON , vous avez besoin d'une sous-requête pour cela :

SELECT *
FROM  (
   SELECT DISTINCT ON (conversation_id) *
   FROM   message t
   ORDER  BY conversation_id, created_at DESC
   ) sub
ORDER BY created_at DESC;

L'ordre dans la sous-requête doit correspondre aux colonnes du DISTINCT ON clause, vous devez donc l'envelopper dans une requête externe pour arriver à l'ordre de tri souhaité.

Alternative avec row_number()

Une histoire similaire, vous avez également besoin d'une sous-requête :

SELECT id, sender_id, receiver_id, conversation_id, subject, body, created_at
FROM  (
   SELECT *, row_number() OVER (PARTITION BY conversation_id
                                ORDER BY created_at DESC) AS rn
   FROM   message t
   ) sub
WHERE  rn = 1
ORDER  BY created_at DESC;

Aussi probablement plus lent.