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

दो क्षेत्रों के लिए दो सरणियाँ बनाएँ, सरणियों के क्रम को सिंक में रखते हुए (बिना सबक्वेरी के)

मैंने आपके कॉलम का नाम समूह बदल दिया है करने के लिए जीआरपी क्योंकि समूह एक आरक्षित शब्द है Postgres और प्रत्येक SQL मानक में और पहचानकर्ता के रूप में उपयोग नहीं किया जाना चाहिए।

मैं आपके प्रश्न को इस प्रकार समझता हूँ:

दो सरणियों को समान क्रम में क्रमबद्ध करें ताकि समान तत्व स्थिति दोनों सरणियों में समान पंक्ति से मेल खाती हो।

सबक्वायरी का उपयोग करें या सीटीई और आपके एकत्र होने से पहले पंक्तियों को क्रमित करें।

SELECT id, array_agg(grp) AS grp, array_agg(dt) AS dt
FROM  (
    SELECT *
    FROM   tbl
    ORDER  BY id, grp, dt
    ) x
GROUP  BY id;

यह तेज़ है व्यक्तिगत उपयोग करने के बजाय एग्रीगेट फंक्शन में क्लॉज array_agg() जैसे @Mosty प्रदर्शित करता है (और जो PostgreSQL 9.0 के बाद से है)। मोस्टी भी आपके प्रश्न की अलग तरह से व्याख्या करता है और उसकी व्याख्या के लिए उचित उपकरणों का उपयोग करता है।

क्या आदेश दिया गया है सबक्वायरी में सुरक्षित?

मैनुअल:

तो हाँ, उदाहरण में यह सुरक्षित है।

बिना सबक्वेरी के

अगर आपको वाकई ज़रूरत है समाधान बिना सबक्वेरी के , आप कर सकते हैं:

SELECT id
     , array_agg(grp ORDER BY grp)
     , array_agg(dt  ORDER BY grp, dt)
FROM   tbl
GROUP  BY id;

नोट करें जीआरपी, डीटी द्वारा आदेश . मैं dt . के आधार पर छाँटता हूँ संबंधों को तोड़ने और क्रम को स्पष्ट करने के अलावा। grp . के लिए आवश्यक नहीं है , हालांकि।

ऐसा करने का एक पूरी तरह से अलग तरीका भी है, विंडो फ़ंक्शंस<के साथ /ए> :

SELECT DISTINCT ON (id)
       id
     , array_agg(grp) OVER w AS grp
     , array_agg(dt)  OVER w AS dt
FROM   tbl
WINDOW w AS (PARTITION BY id ORDER BY grp, dt
             ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
ORDER  BY id;

DISTINCT ON (id) पर ध्यान दें केवल DISTINCT . के बजाय जो एक ही परिणाम देता है लेकिन परिमाण के क्रम से तेजी से प्रदर्शन करता है क्योंकि हमें अतिरिक्त प्रकार की आवश्यकता नहीं होती है।

मैंने कुछ परीक्षण चलाए और यह लगभग दो अन्य समाधानों जितना तेज़ है। जैसा कि अपेक्षित था, सबक्वेरी संस्करण अभी भी सबसे तेज था। व्याख्या विश्लेषण . के साथ परीक्षण करें खुद देखने के लिए।



  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. कैसे PostgreSQL में श्रेणी के आधार पर अधिकतम तिथि समूह के साथ आईडी का चयन करने के लिए?

  5. हरोकू पोस्टग्रेज:psql:FATAL:होस्ट के लिए कोई pg_hba.conf प्रविष्टि नहीं