दिलचस्प पोस्ट
पांडास डेटा फ्रेम में एक स्तंभ को कैसे फैलाना क्या अक्षर विंडोज और लिनक्स निर्देशिका नामों में मना किया है? सुनिश्चित करें कि OnPropertyChanged () को UI थ्रेड पर MVVM WPF ऐप में कहा जाता है आईओएस ऑटोलायआउट- दृश्यों के बीच दो अलग-अलग दूरी सेट करने के तरीके, स्क्रीन ऊंचाई पर निर्भर करता है Xcode 8 में व्युत्पन्न डेटा कैसे हटाएं? "पॉइंटर टू पॉइन्टर टू गैर-कॉन्स्ट" को "पॉइंटर टू पॉइन्टर टू कॉन्स्ट" करने के लिए क्यों यह कानूनी नहीं है? OpenCV और पायथन का उपयोग कर एक वेबकैम फ़ीड प्रदर्शित करना एएसपी.नेट एमवीसी: संपत्ति के नामों के सीआरआलाइजेशन को जेसनआरसल्ट के साथ नियंत्रित करना ITextSharp के साथ पीडीएफ संपीड़न क्यों यह विभाजन पायथन में काम नहीं करता है? एडीआई नियंत्रक 404 देता है जब आईडी में अवधि होती है मैं एक लॉगिन फॉर्म कैसे बंद कर सकता हूं और मेरा आवेदन बंद होने के बिना मुख्य फॉर्म कैसे दिखा सकता हूं? IPython नोटबुक स्थान त्रुटि MySql एकल तालिका, पिछले 7 दिनों का चयन करें और खाली पंक्तियां शामिल करें मैं अपने मूल तत्वों को परिवर्तित किए बिना एक तत्व का पाठ कैसे बदल सकता / सकती हूं?

PostgreSQL अलग आदेश के साथ पर अलग

मैं इस क्वेरी को चलाने के लिए चाहता हूं:

SELECT DISTINCT ON (address_id) purchases.address_id, purchases.* FROM purchases WHERE purchases.product_id = 1 ORDER BY purchases.purchased_at DESC 

लेकिन मुझे यह त्रुटि मिलती है:

पीजी :: त्रुटि: त्रुटि: अभिव्यक्ति के आधार पर चयन को अभिव्यक्ति के प्रारंभिक आदेश से मेल खाना चाहिए

पहले ORDER BY अभिव्यक्ति के रूप में address_id जोड़ना त्रुटि को चुप्पी करता है, लेकिन मैं वास्तव में address_id पर सॉर्टिंग नहीं जोड़ना चाहता हूं क्या यह address_id बिना आदेश करना संभव है?

वेब के समाधान से एकत्रित समाधान "PostgreSQL अलग आदेश के साथ पर अलग"

दस्तावेज़ीकरण कहते हैं:

पर अलग (अभिव्यक्ति [, …]) केवल उन पंक्तियों के प्रत्येक सेट की पहली पंक्ति रखती है जहां दिए गए भाव बराबर का मूल्यांकन करते हैं। […] ध्यान दें कि प्रत्येक सेट का "प्रथम पंक्ति" अप्रत्याशित है, जब तक यह सुनिश्चित करने के लिए उपयोग नहीं किया जाता है कि वांछित पंक्ति पहले दिखाई दे। […] अभिव्यक्ति (पर) पर अंतर बाईं ओर ORDER BY अभिव्यक्ति (मेलों) से मेल खाना चाहिए।

आधिकारिक दस्तावेज

इसलिए आपको address_id को क्रम से जोड़ना होगा।

वैकल्पिक रूप से, यदि आप पूर्ण पंक्ति में देख रहे हैं जिसमें प्रत्येक address_id लिए सबसे हाल ही में खरीदे गए उत्पाद शामिल हैं और उस परिणाम को खरीदा_एटी द्वारा सॉर्ट किया गया है, तो आप सबसे बड़ी एन प्रति समूह समस्या हल करने का प्रयास कर रहे हैं जो निम्न तरीकों से हल किया जा सकता है:

सामान्य समाधान जो सबसे अधिक डीबीएमएस में काम करना चाहिए:

 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 

@ एचकेएफ के जवाब पर आधारित एक और पोस्टग्रेश एसक्यूएल-उन्मुख समाधान:

 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 

समस्या को स्पष्ट, विस्तारित और हल किया गया: कुछ कॉलम द्वारा क्रमबद्ध पंक्तियों का चयन और दूसरे पर अलग

आप एक subquery में address_id द्वारा आदेश कर सकते हैं, फिर एक बाहरी क्वेरी में आप क्या चाहते हैं।

 SELECT * FROM (SELECT DISTINCT ON (address_id) purchases.address_id, purchases.* FROM "purchases" WHERE "purchases"."product_id" = 1 ORDER BY address_id DESC ) ORDER BY purchased_at DESC 

एक subquery इसे हल कर सकते हैं:

 SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ) p ORDER BY purchased_at DESC; 

ORDER BY में अग्रणी अभिव्यक्तियों को अलग-अलग कॉलम से सहमत होना है, इसलिए आप एक ही SELECT में विभिन्न कॉलमों द्वारा आदेश नहीं दे सकते।

यदि आप प्रत्येक सेट से किसी विशेष पंक्ति को चुनना चाहते हैं, तो केवल उप-श्रेणी में एक अतिरिक्त ORDER BY उपयोग करें:

 SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC -- get "latest" row per address_id ) p ORDER BY purchased_at DESC; 

यदि DESC NULLS LAST NULL हो सकता NULL , तो DESC NULLS LAST NULL DESC NULLS LAST विचार करें।
अधिक स्पष्टीकरण के साथ संबंधित:

  • समूह की प्रत्येक समूह में पहली पंक्ति का चयन करें?
  • पोस्टग्रेएसक्यूएल सॉर्ट, डेटटाइम एस्क, नल पहले?

विंडो फ़ंक्शन एक पास में हल कर सकता है:

 SELECT DISTINCT ON (address_id) LAST_VALUE(purchases.address_id) OVER wnd AS address_id FROM "purchases" WHERE "purchases"."product_id" = 1 WINDOW wnd AS ( PARTITION BY address_id ORDER BY purchases.purchased_at DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 

फ्लास्क-एसक्यूएललेमी वाले किसी के लिए, यह मेरे लिए काम करता है

 from app import db from app.models import Purchases from sqlalchemy.orm import aliased from sqlalchemy import desc stmt = Purchases.query.distinct(Purchases.address_id).subquery('purchases') alias = aliased(Purchases, stmt) distinct = db.session.query(alias) distinct.order_by(desc(alias.purchased_at)) 

आप खंड द्वारा समूह का उपयोग करके यह भी कर सकते हैं

  SELECT purchases.address_id, purchases.* FROM "purchases" WHERE "purchases"."product_id" = 1 GROUP BY address_id, purchases.purchased_at ORDER purchases.purchased_at DESC