मानक समग्र कार्य array_agg()
केवल आधार प्रकारों के लिए काम करता है, इनपुट के रूप में सरणी प्रकारों के लिए नहीं। (लेकिन पोस्टग्रेज 9.5+ array_agg()
. का एक नया संस्करण है वह कर सकता है!)
आप कस्टम एग्रीगेट फ़ंक्शन का उपयोग कर सकते हैं array_agg_mult()
जैसा कि इस संबंधित उत्तर में परिभाषित किया गया है:
डेटा को पोस्टग्रेज़ सरणी में चुनना
इसे प्रति डेटाबेस एक बार बनाएं। तब आपकी क्वेरी इस तरह काम कर सकती है:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
लिंक किए गए उत्तर में एक विस्तृत तर्क है।
विस्तार का मिलान होना चाहिए
आपकी टिप्पणी के जवाब में, सरणी प्रकारों पर मैनुअल से इस उद्धरण पर विचार करें:
<ब्लॉकक्वॉट>बहुआयामी सरणियों में प्रत्येक आयाम के लिए मिलान विस्तार होना चाहिए। एक बेमेल एक त्रुटि का कारण बनता है।
इसके आसपास कोई रास्ता नहीं है, सरणी प्रकार पोस्टग्रेज़ में इस तरह के बेमेल की अनुमति नहीं देता है। आप कर सकते थे अपने सरणियों को NULL मानों के साथ पैड करें ताकि सभी आयामों का मिलान विस्तार हो।
लेकिन मैं array_to_string()
के साथ सरणियों को अल्पविराम से अलग की गई सूचियों में अनुवाद करना चाहूंगा इस क्वेरी के प्रयोजन के लिए और string_agg()
. का उपयोग करें text
को एकत्रित करने के लिए - अधिमानतः एक अलग विभाजक के साथ। मेरे उदाहरण में एक नई पंक्ति का उपयोग करना:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM ...
सामान्य करें
शुरू करने के लिए आप अपनी स्कीमा को सामान्य बनाने पर विचार कर सकते हैं। आम तौर पर, आप इस उदाहरण में उल्लिखित एक अलग तालिका के साथ ऐसे n:m संबंध लागू करेंगे:
PostgreSQL में कई-से-अनेक संबंध कैसे कार्यान्वित करें?