PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt Datensätze zurück, die sich in einer Spalte unterscheiden, aber nach einer anderen Spalte sortiert sind

DISTINCT ON

Wenn Sie DISTINCT ON , dafür brauchen Sie eine Unterabfrage:

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

Die Reihenfolge in der Unterabfrage muss mit den Spalten im DISTINCT ON übereinstimmen -Klausel, also müssen Sie sie in eine äußere Abfrage einschließen, um zu Ihrer gewünschten Sortierreihenfolge zu gelangen.

Alternativ mit row_number()

Ähnliche Geschichte, Sie brauchen auch eine Unterabfrage:

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;

Wahrscheinlich auch langsamer.