प्रलेखन कहता है:
DISTINCT ON (अभिव्यक्ति [, ...]) उन पंक्तियों के प्रत्येक सेट की पहली पंक्ति रखता है जहाँ दिए गए भाव समान मूल्यांकन करते हैं। [...] ध्यान दें कि प्रत्येक सेट की "पहली पंक्ति" अप्रत्याशित है जब तक कि यह सुनिश्चित करने के लिए ORDER BY का उपयोग नहीं किया जाता है कि वांछित पंक्ति पहले दिखाई देती है। [...] DISTINCT ON अभिव्यक्ति (ओं) को बाईं ओर की अभिव्यक्ति से मेल खाना चाहिए।
आधिकारिक दस्तावेज
इसलिए आपको address_id
ऑर्डर को जोड़ना होगा ।
वैकल्पिक रूप से, यदि आप पूरी पंक्ति की तलाश कर रहे हैं, जिसमें प्रत्येक के लिए सबसे हाल ही में खरीदा गया उत्पाद है address_id
और purchased_at
तब तक के लिए हल किया गया है, तो आप समूह की सबसे बड़ी समस्या को हल करने का प्रयास कर रहे हैं जिसे निम्नलिखित तरीकों से हल किया जा सकता है:
सामान्य समाधान जो अधिकांश DBMS में काम करना चाहिए:
SELECT t1.* FROM purchases t1
JOIN (
SELECT address_id, max(purchased_at) max_purchased_at
FROM purchases
WHERE product_id = 1
GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC
@ Hkf के उत्तर के आधार पर एक अधिक पोस्टग्रेसीक्यूएल-उन्मुख समाधान:
SELECT * FROM (
SELECT DISTINCT ON (address_id) *
FROM purchases
WHERE product_id = 1
ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC
समस्या यहाँ स्पष्ट, विस्तारित और हल की गई है: कुछ कॉलम द्वारा आदेशित पंक्तियों का चयन करना और दूसरे पर अलग