PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

निम्नलिखित पंक्तियों को अद्वितीय मान के आधार पर कैसे समूहित करें

यदि आपका मामला उतना ही सरल है जितना कि उदाहरण मान सुझाते हैं, @Giorgos' उत्तर अच्छी तरह से कार्य करता है।

हालांकि, आमतौर पर ऐसा नहीं होता . अगर id कॉलम एक serial है , आप इस धारणा पर भरोसा नहीं कर सकते हैं कि एक पंक्ति पहले के time . के साथ है एक छोटा id भी है .
इसके अलावा, time मान (या timestamp जैसा कि आपके पास शायद है) आसानी से डुप्लीकेट हो सकते हैं, आपको सॉर्ट ऑर्डर को स्पष्ट बनाने की आवश्यकता है।

मान लें कि दोनों हो सकते हैं, और आप id . चाहते हैं पंक्ति से जल्द से जल्द time प्रति समय टुकड़ा (वास्तव में, सबसे छोटा id जल्द से जल्द समय . के लिए , संबंध हो सकते हैं), यह प्रश्न स्थिति से ठीक से निपटेगा:

SELECT *
FROM  (
   SELECT DISTINCT ON (way, grp)
          id, way, time AS time_from
        , max(time) OVER (PARTITION BY way, grp) AS time_to
   FROM (
      SELECT *
           , row_number() OVER (ORDER BY time, id)  -- id as tie breaker
           - row_number() OVER (PARTITION BY way ORDER BY time, id) AS grp
      FROM   table1
      ) t
   ORDER  BY way, grp, time, id
   ) sub
ORDER  BY time_from, id;
  • ORDER BY time, id असंदिग्ध होना। मान लें कि समय नहीं है अद्वितीय, जोड़ें (अद्वितीय माना जाता है) id मनमाने परिणामों से बचने के लिए - जो गुप्त तरीकों से प्रश्नों के बीच बदल सकता है।

  • max(time) OVER (PARTITION BY way, grp) :बिना ORDER BY , विंडो फ्रेम पार्टिशन की सभी पंक्तियों को फैलाता है, इसलिए हमें पूर्ण अधिकतम प्रति बार टुकड़ा मिलता है।

  • परिणाम में वांछित सॉर्ट क्रम उत्पन्न करने के लिए बाहरी क्वेरी परत केवल आवश्यक है, क्योंकि हम एक अलग ORDER BY के लिए बाध्य हैं सबक्वेरी में sub DISTINCT ON . का उपयोग करके . विवरण:

SQL Fiddle उपयोग के मामले का प्रदर्शन।

यदि आप प्रदर्शन को अनुकूलित करना चाहते हैं, तो ऐसे मामले में एक plpgsql फ़ंक्शन तेज़ हो सकता है। निकट से संबंधित उत्तर:

इसके अलावा:मूल प्रकार के नाम का उपयोग न करें time पहचानकर्ता के रूप में (एक मानक SQL में आरक्षित शब्द )।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल इंजेक्शन को रोकने के लिए पैरामीटरयुक्त एसक्यूएल क्वेरी कैसे लिखें?

  2. पोस्टग्रेज:प्रति डेवलपर सबसे लंबी स्ट्रीक (दिनों में) को परिभाषित करना

  3. पीजी ::डुप्लीकेटटेबल:त्रुटि:संबंध पोस्ट पहले से मौजूद हैं

  4. JDBC का उपयोग करके डेटाबेस को पोस्टग्रेज करने के लिए (Py) स्पार्क कैसे कनेक्ट करें

  5. Amazon Redshift में पूर्णांक रूपांतरण के लिए हेक्स स्ट्रिंग