Thay vì sử dụng các chức năng cửa sổ và phân trang, hãy sử dụng GROUP BY ở cấp độ truy vấn và tổng hợp bằng mệnh đề DISTINCT:
SELECT
rnp.grp_id,
array_to_string(array_agg(distinct rnp.cabinets),',') AS cabinets,
array_to_string(array_agg(distinct ips.address),',') AS addresses
FROM rnp JOIN ips ON rnp.grp_id=ips.grp_id GROUP BY rnp.grp_id, ips.grp_id;
Kết quả:
grp_id | cabinets | addresses
--------+-------------------------+-----------
11 | cabs1,cabs2,cabs3,cabs4 | CA,NY
22 | c1,c2 | DC,LA
(2 rows)
Chìa khóa ở đây là thay vì sử dụng các chức năng cửa sổ và phân lớp, bạn sử dụng GROUP BY
cấp truy vấn và tổng hợp bằng DISTINCT
mệnh đề.
Điều này cũng sẽ hoạt động với phương pháp tiếp cận hàm cửa sổ, ngoại trừ PostgreSQL (ít nhất là 9.1) không hỗ trợ DISTINCT
trong các chức năng cửa sổ:
regress=# SELECT DISTINCT
rnp.grp_id,
array_to_string(array_agg(distinct rnp.cabinets)OVER (PARTITION BY rnp.grp_id), ',') AS cabinets,
array_to_string(array_agg(distinct ips.address) OVER (PARTITION BY ips.grp_id), ',') AS addresses
FROM rnp JOIN ips ON rnp.grp_id=ips.grp_id;
ERROR: DISTINCT is not implemented for window functions
LINE 3: array_to_string(array_agg(distinct rnp.cabinets)OVER (PART...