दस्तावेज़ीकरण कहता है:
<ब्लॉकक्वॉट>DISTINCT ON (अभिव्यक्ति [,...] ) पंक्तियों के प्रत्येक सेट की केवल पहली पंक्ति रखता है जहाँ दिए गए व्यंजकों का मूल्यांकन बराबर होता है। [...] ध्यान दें कि प्रत्येक सेट की "पहली पंक्ति" अप्रत्याशित है जब तक कि यह सुनिश्चित करने के लिए ORDER BY का उपयोग नहीं किया जाता है कि वांछित पंक्ति पहले दिखाई देती है। [...] व्यंजकों पर DISTINCT का मिलान सबसे बाईं ओर के ORDER BY व्यंजकों से होना चाहिए।
आधिकारिक दस्तावेज
तो आपको address_id
जोड़ना होगा द्वारा आदेश के लिए।
वैकल्पिक रूप से, यदि आप पूरी पंक्ति की तलाश कर रहे हैं जिसमें प्रत्येक address_id
के लिए सबसे हाल ही में खरीदा गया उत्पाद है और उस परिणाम को purchased_at
. द्वारा क्रमबद्ध किया गया तो आप प्रति समूह एक सबसे बड़ी N समस्या को हल करने का प्रयास कर रहे हैं जिसे निम्नलिखित तरीकों से हल किया जा सकता है:
सामान्य समाधान जो अधिकांश 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 के उत्तर पर आधारित एक अधिक PostgreSQL-उन्मुख समाधान:
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
समस्या को यहां स्पष्ट, विस्तारित और हल किया गया है:कुछ कॉलम द्वारा क्रमबद्ध पंक्तियों का चयन करना और दूसरे पर अलग करना