Verwenden Sie anstelle von Fensterfunktionen und Partitionierung ein GROUP BY auf Abfrageebene und ein Aggregat mit einer DISTINCT-Klausel:
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;
Ergebnis:
grp_id | cabinets | addresses
--------+-------------------------+-----------
11 | cabs1,cabs2,cabs3,cabs4 | CA,NY
22 | c1,c2 | DC,LA
(2 rows)
Der Schlüssel hier ist, dass Sie anstelle von Fensterfunktionen und Partitionierung ein GROUP BY
auf Abfrageebene verwenden und mit einem DISTINCT
aggregieren Klausel.
Dies würde auch mit dem Fensterfunktionsansatz funktionieren, außer dass PostgreSQL (mindestens 9.1) DISTINCT
nicht unterstützt in Fensterfunktionen:
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...