DISTINCT ON
DISTINCT ON
、そのためのサブクエリが必要です:
SELECT *
FROM (
SELECT DISTINCT ON (conversation_id) *
FROM message t
ORDER BY conversation_id, created_at DESC
) sub
ORDER BY created_at DESC;
サブクエリの順序は、 DISTINCT ON
の列と一致する必要があります 句なので、目的の並べ替え順序に到達するには、外部クエリでラップする必要があります。
row_number()
の代替
同様の話ですが、サブクエリも必要です:
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;
また、おそらく遅いです。