sql >> Base de Datos >  >> RDS >> PostgreSQL

Devolver registros distintos en una columna pero ordenados por otra columna

DISTINCT ON

Si usa DISTINCT ON , necesita una subconsulta para eso:

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

El orden en la subconsulta debe coincidir con las columnas en DISTINCT ON cláusula, por lo que debe envolverla en una consulta externa para llegar al orden de clasificación deseado.

Alternativa con row_number()

Historia similar, también necesita una 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;

Probablemente también más lento.