2012-05-06 10 views
7

Ngoài câu hỏi How to concatenate strings of a string field in a PostgreSQL 'group by' query?Chuỗi tổng hợp theo thứ tự giảm dần trong truy vấn PostgreSQL

Làm cách nào để sắp xếp nhân viên theo thứ tự giảm dần?

Tôi đang sử dụng PostgreSQL 8.4 không hỗ trợ string_agg(). Tôi đã cố gắng sử dụng các mục sau, nhưng không được hỗ trợ:

array_to_string(array_agg(employee ORDER BY employee DESC), ',') 

Tôi đánh giá cao bất kỳ gợi ý nào cho câu trả lời đúng.

Trả lời

13

Trong PostgreSQL 9.0 hay muộn bạn có thể order elements inside aggregate functions:

SELECT company_id, array_agg(employee ORDER BY company_id DESC)::text 
FROM tbl 
GROUP BY 1; 

Đó là không có sẵn cho PostgreSQL 8.4. Bạn phải đặt trước các giá trị để được tổng hợp. Sử dụng một subselect hoặc CTE (8.4+) cho mục đích này:

SELECT company_id, array_agg(employee)::text 
FROM (SELECT * FROM tbl ORDER BY company_id, employee DESC) x 
GROUP BY 1; 

Tôi ra lệnh bởi company_id ngoài, bởi vì đó nên tăng tốc độ tổng hợp.

Tôi cũng sử dụng "thủ thuật" chỉ cần đưa mảng đến text (array_agg(employee)::text), cung cấp cho bạn chuỗi phân cách bằng dấu phẩy, không có khoảng trắng bổ sung và là cách nhanh nhất.
Để có định dạng phức tạp hơn, hãy sử dụng array_to_string(array_agg(employee), ', ') như bạn có trong câu hỏi của mình.

+0

Cảm ơn bạn đời, đó là những gì tôi đang tìm :) – David