PostgreSQL array_agg आदेश


108

टेबल 'जानवर':

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

क्या मैं यह सुनिश्चित कर सकता हूं कि पहले एग्रीगेट फंक्शन में ऑर्डर हमेशा दूसरे की तरह ही हो। मेरा मतलब है कि मैं प्राप्त नहीं करना चाहता:

Tom;Jerry;Kermit, Frog;Mouse,Cat

7
यदि आप 9.0 पर हैं, तो आप नेस्टेड कॉल को सिंगलstring_agg()
a_horse_with_no_name से

जवाबों:


27

यदि आप PostgreSQL के संस्करण <9.0 पर हैं तो:

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

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

सेलेक्ट xmlagg (x) FROM (Select x FROM test ORDER BY y DESC) AS टैब;

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

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 पर इनपुट तब unordered होगा लेकिन यह दोनों कॉलम में समान होगा। और यदि आप चाहें तो आप ORDER BYउपशम के लिए एक खंड जोड़ सकते हैं ।


336

मैन्युअल रूप से इस तरह एक ORDER BY का उपयोग करें :

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

42
नोट: PostgreSQL 9 में पेश किया ORDER BYगया array_aggहै
UlfR

6
PostgreSQL 9+ को स्वीकार किए गए उत्तर से बहुत बेहतर है।
एरिक

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

10
ध्यान दें कि इसके लिए काम नहीं करता हैarray_agg(DISTINCT a ORDER BY b)
cerd

1
कई स्तंभों के लिए उपयोग करते समय आपको कोष्ठक जोड़ना होगा:array_agg((a, b, c) ORDER BY b)
bennos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.