PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Restituisce record distinti su una colonna ma ordinati in base a un'altra colonna

DISTINCT ON

Se utilizzi DISTINCT ON , hai bisogno di una sottoquery per questo:

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

L'ordine nella sottoquery deve corrispondere alle colonne del DISTINCT ON clausola, quindi è necessario racchiuderla in una query esterna per arrivare all'ordinamento desiderato.

Alternativa con row_number()

Storia simile, hai bisogno anche di una sottoquery:

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;

Probabilmente anche più lento.