2011-09-06 9 views
52

टेबल 'जानवर':PostgreSQL array_agg आदेश

animal_name animal_type 
Tom   Cat 
Jerry  Mouse 
Kermit  Frog 

क्वेरी:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names, 
array_to_string(array_agg(animal_type),';') animal_types 
FROM animals; 

अपेक्षित परिणाम:

Tom;Jerry;Kerimt, Cat;Mouse;Frog 
OR 
Tom;Kerimt;Jerry, Cat;Frog;Mouse 

मुझे यकीन है कि पहला समेकित फ़ंक्शन- में आदेश हमेशा रहेंगे किया जा सकता है दूसरे में जैसा ही है। मेरा मतलब है मैं प्राप्त करना चाहते would't:

Tom;Jerry;Kermit, Frog;Mouse,Cat 
+6

यदि आप 9.0 पर हैं तो आप नेस्टेड कॉल को एक 'string_agg() ' –

उत्तर

20

आप < 9.0 फिर एक PostgreSQL संस्करण पर हैं:

से: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

वर्तमान कार्यान्वयन में, इनपुट का क्रम सिद्धांत रूप से अनिर्दिष्ट है। एक क्रमबद्ध सबक्वायरी से इनपुट मानों की आपूर्ति आमतौर पर काम करेगी। उदाहरण के लिए:

से चुनें xmlagg (x) से चुनें (वाई डीईएससी द्वारा टेस्ट ऑर्डर से एक्स चुनें) एएस टैब;

तो आपके मामले में आप लिखते हैं:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names, 
array_to_string(array_agg(animal_type),';') animal_types 
FROM (SELECT animal_name, animal_type FROM animals) AS x; 

array_agg के लिए इनपुट तो अव्यवस्थित होगा, लेकिन यह दोनों स्तंभों में ही होगा। और यदि आप चाहें तो आप subquery पर ORDER BY खंड जोड़ सकते हैं।

+0

मैंने इस बारे में सोचा था, लेकिन जब यह बग्गी निकला तो मुझे पता चला कि एक सबक्वायरी में ऑर्डर अजीब तरह से काम नहीं करता है https://stackoverflow.com/questions/16248813/is-order-in- एक-सबक्वेरी-गारंटी करने के लिए किया जा संरक्षित – Adamantish

171

एक आदेश द्वारा उपयोग, manual से इस उदाहरण की तरह:

SELECT array_agg(a ORDER BY b DESC) FROM table; 
+25

के साथ प्रतिस्थापित कर सकते हैं नोट:' array_agg' में' ORDER BY' पोस्टग्रेएसक्यूएल 9 – UlfR

+4

में पोस्ट किया गया है PostgreSQL 9+ मानते हुए स्वीकार किए गए उत्तर से काफी बेहतर है। – Erik

+1

क्या आप कृपया चयन के लिए ORDER BY के साथ नमूना दे सकते हैं: जानवरों से array_agg (animal_name), array_agg (animal_type) चुनें; ? – GKislin