sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnera poster distinkta i en kolumn men sorteras efter en annan kolumn

DISTINCT ON

Om du använder DISTINCT ON , du behöver en underfråga för det:

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

Ordningen i underfrågan måste överensstämma med kolumnerna i DISTINCT ON klausul, så du måste slå in den i en yttre fråga för att komma fram till önskad sorteringsordning.

Alternativ med row_number()

Liknande historia, du behöver också en underfråga:

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;

Också förmodligen långsammare.




  1. SQL-fråga baserad på annan tabell

  2. analysera resultat i MySQL via REGEX

  3. Hur man lägger till antal arbetsdagar till ett visst datum

  4. MySQL lagrad procedur för att skapa användare