PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Retorna registros distintos em uma coluna, mas ordenados por outra coluna

DISTINCT ON


Se você usar DISTINCT ON , você precisa de uma subconsulta para isso:
SELECT *
FROM  (
   SELECT DISTINCT ON (conversation_id) *
   FROM   message t
   ORDER  BY conversation_id, created_at DESC
   ) sub
ORDER BY created_at DESC;

A ordem na subconsulta deve concordar com as colunas no DISTINCT ON cláusula, portanto, você deve envolvê-la em uma consulta externa para chegar à ordem de classificação desejada.

Alternativa com row_number()


História semelhante, você também precisa de uma subconsulta:
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;

Também provavelmente mais lento.