Gebruik in plaats van vensterfuncties en patitionering een GROUP BY op queryniveau en aggregeer met een DISTINCT-clausule:
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;
Resultaat:
grp_id | cabinets | addresses
--------+-------------------------+-----------
11 | cabs1,cabs2,cabs3,cabs4 | CA,NY
22 | c1,c2 | DC,LA
(2 rows)
De sleutel hier is dat in plaats van vensterfuncties en patitionering te gebruiken, u een GROUP BY
op queryniveau gebruikt en aggregeer met een DISTINCT
clausule.
Dit zou ook werken met de benadering van de vensterfunctie, behalve dat PostgreSQL (tenminste 9.1) DISTINCT
niet ondersteunt in vensterfuncties:
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...