2011-09-06 63 views
52

Bảng 'động vật':PostgreSQL array_agg trật tự

animal_name animal_type 
Tom   Cat 
Jerry  Mouse 
Kermit  Frog 

Query:

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

Kết quả mong đợi:

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

Tôi có thể chắc chắn rằng trật tự trong chức năng tổng hợp đầu tiên sẽ luôn luôn được giống như trong thứ hai. tôi có nghĩa là tôi would't muốn nhận được:

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

Nếu bạn đang ở trên 9.0, bạn có thể thay thế các cuộc gọi lồng nhau bằng một 'string_agg()' –

Trả lời

20

Nếu bạn đang ở trên một phiên bản PostgreSQL < 9.0 thì:

Từ: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

Trong thực hiện hiện tại, thứ tự của đầu vào là nguyên tắc không xác định. Tuy nhiên, việc cung cấp các giá trị đầu vào từ một truy vấn con được sắp xếp thường sẽ hoạt động. Ví dụ:

CHỌN xmlagg (x) TỪ (SELECT x FROM test ORDER BY y DESC) AS tab;

Vì vậy, trong trường hợp của bạn, bạn sẽ viết:

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; 

Đầu vào array_agg sau đó sẽ có thứ tự nhưng nó sẽ là như nhau trong cả hai cột. Và nếu bạn thích, bạn có thể thêm mệnh đề ORDER BY vào truy vấn phụ.

+0

Tôi đã nghĩ về điều này nhưng khi nó bật ra lỗi, tôi phát hiện ra rằng theo thứ tự trong một truy vấn con kỳ lạ không hoạt động https://stackoverflow.com/questions/16248813/is-order-in- một bảo đảm phụ được bảo đảm để được bảo tồn – Adamantish

171

Sử dụng ORDER BY, như ví dụ này từ manual:

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

Lưu ý: 'ORDER BY' trong' mảng_agg' được giới thiệu trong PostgreSQL 9 – UlfR

+4

Tốt hơn nhiều so với câu trả lời được chấp nhận giả sử PostgreSQL 9+. – Erik

+1

Bạn có thể vui lòng cung cấp mẫu với ORDER BY để chọn: SELECT array_agg (animal_name), array_agg (animal_type) FROM animals; ? – GKislin