Thứ tự mảng_agg PostgreSQL


106

Bảng 'động vật':

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

Truy vấn:

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 thứ tự trong hàm tổng hợp đầu tiên sẽ luôn giống như trong hàm thứ hai. Ý tôi là tôi không muốn nhận được:

Tom;Jerry;Kermit, Frog;Mouse,Cat

7
Nếu bạn đang ở trên 9.0, bạn có thể thay thế các cuộc gọi lồng nhau với một singlestring_agg()
a_horse_with_no_name

Câu trả lời:


27

Nếu bạn đang sử dụng phiên bản PostgreSQL <9.0 thì:

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

Trong cách triển khai hiện tại, thứ tự của đầu vào về nguyên tắc là 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ụ:

SELECT xmlagg (x) FROM (LỆNH CHỌN x TỪ thử nghiệm THEO 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 cho array_agg sau đó sẽ không có thứ tự nhưng nó sẽ giống nhau trong cả hai cột. Và nếu bạn muốn, bạn có thể thêm một ORDER BYmệnh đề vào truy vấn con.


330

Sử dụng ORDER BY, như ví dụ này từ sách hướng dẫn :

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

41
Lưu ý: ORDER BYtrong array_aggđược giới thiệu trong PostgreSQL 9
UlfR

6
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 cho lựa chọn: SELECT array_agg (tên_vực vật), array_agg (loại_sản_phẩm) FROM động vật; ?
Grigory Kislin

8
Lưu ý rằng điều này không hoạt động choarray_agg(DISTINCT a ORDER BY b)
cerd

1
Khi sử dụng cho nhiều cột bạn phải thêm dấu ngoặc đơn:array_agg((a, b, c) ORDER BY b)
bennos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.