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.