DISTINCT ON
Si vous utilisez DISTINCT ON
, vous avez besoin d'une sous-requête pour cela :
SELECT *
FROM (
SELECT DISTINCT ON (conversation_id) *
FROM message t
ORDER BY conversation_id, created_at DESC
) sub
ORDER BY created_at DESC;
L'ordre dans la sous-requête doit correspondre aux colonnes du DISTINCT ON
clause, vous devez donc l'envelopper dans une requête externe pour arriver à l'ordre de tri souhaité.
Alternative avec row_number()
Une histoire similaire, vous avez également besoin d'une sous-requête :
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;
Aussi probablement plus lent.