मैं थोड़ा भ्रमित हूँ, क्योंकि आपका तर्क जल्द से जल्द . लाने के लिए प्रतीत होगा संदेश नवीनतम नहीं।
हालांकि distinct on
काफी शक्तिशाली है, मुझे यकीन नहीं है कि आप जो चाहते हैं उसे आसानी से प्राप्त कर सकते हैं। मेरा झुकाव विंडो फ़ंक्शंस का उपयोग करने के लिए स्विच करना है:
SELECT m.*
FROM (SELECT m.*,
(CASE WHEN sender_id < recipient_id
THEN (sender_id, recipient_id)
ELSE (recipient_id, sender_id)
END) AS pair,
ROW_NUMBER() OVER (PARTITION BY (CASE WHEN sender_id < recipient_id
THEN (sender_id, recipient_id)
ELSE (recipient_id, sender_id)
END)
ORDER BY created_at, unread_count DESC
) as seqnum,
SUM(CASE WHEN m.opened = false THEN 0 ELSE 1 END) OVER
(PARTITION BY (CASE WHEN sender_id < recipient_id
THEN (sender_id, recipient_id)
ELSE (recipient_id, sender_id)
END)
) as NumUnopened
FROM "messages" m
WHERE ((recipient_id = 6 and recipient_delete = false) or
(sender_id = 6 and sender_delete = false))
) t
WHERE seqnum = 1;