Istället för att använda fönsterfunktioner och patitionering, använd en GROUP BY på frågenivå och aggregera med en DISTINCT-sats:
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;
Resultat:
grp_id | cabinets | addresses
--------+-------------------------+-----------
11 | cabs1,cabs2,cabs3,cabs4 | CA,NY
22 | c1,c2 | DC,LA
(2 rows)
Nyckeln här är att istället för att använda fönsterfunktioner och patitionering använder du en frågenivå GROUP BY
och aggregera med en DISTINCT
klausul.
Detta skulle också fungera med fönsterfunktionsmetoden, förutom att PostgreSQL (åtminstone 9.1) inte stöder DISTINCT
i fönsterfunktioner:
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...