मैंने आपके कॉलम का नाम समूह
बदल दिया है करने के लिए जीआरपी
क्योंकि समूह
एक आरक्षित शब्द
है 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
. के बजाय जो एक ही परिणाम देता है लेकिन परिमाण के क्रम से तेजी से प्रदर्शन करता है क्योंकि हमें अतिरिक्त प्रकार की आवश्यकता नहीं होती है।
मैंने कुछ परीक्षण चलाए और यह लगभग दो अन्य समाधानों जितना तेज़ है। जैसा कि अपेक्षित था, सबक्वेरी संस्करण अभी भी सबसे तेज था। व्याख्या विश्लेषण
. के साथ परीक्षण करें खुद देखने के लिए।