DISTINCT ON
Nếu bạn sử dụng DISTINCT ON
, bạn cần một truy vấn con cho điều đó:
SELECT *
FROM (
SELECT DISTINCT ON (conversation_id) *
FROM message t
ORDER BY conversation_id, created_at DESC
) sub
ORDER BY created_at DESC;
Thứ tự trong truy vấn con phải đồng ý với các cột trong DISTINCT ON
, vì vậy bạn phải bọc nó trong một truy vấn bên ngoài để đạt được thứ tự sắp xếp mong muốn.
Thay thế bằng row_number()
Câu chuyện tương tự, bạn cũng cần một truy vấn phụ:
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;
Cũng có thể chậm hơn.