ลำดับ PostgreSQL array_agg


110

ตาราง 'สัตว์':

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) จากแท็บ (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 จะไม่เรียงลำดับ แต่จะเหมือนกันในทั้งสองคอลัมน์ และถ้าคุณชอบคุณสามารถเพิ่มORDER BYอนุประโยคในแบบสอบถามย่อยได้


344

ใช้ ORDER BY ดังตัวอย่างนี้จากคู่มือ :

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

43
หมายเหตุ: ORDER BYในการarray_aggเป็นที่รู้จักใน PostgreSQL 9
Úlfr

6
ดีกว่าคำตอบที่ยอมรับโดยสมมติว่า PostgreSQL 9+
Erik

1
คุณช่วยกรุณาให้ตัวอย่างกับ ORDER BY สำหรับการเลือก: SELECT array_agg (animal_name), array_agg (animal_type) จากสัตว์; เหรอ?
Grigory Kislin

11
โปรดทราบว่าสิ่งนี้ใช้ไม่ได้สำหรับarray_agg(DISTINCT a ORDER BY b)
cerd

1
เมื่อใช้หลายคอลัมน์คุณต้องเพิ่มวงเล็บ:array_agg((a, b, c) ORDER BY b)
bennos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.