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.