Au lieu d'utiliser les fonctions de fenêtre et le patitioning, utilisez un GROUP BY au niveau de la requête et un agrégat avec une clause 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;
Résultat :
grp_id | cabinets | addresses
--------+-------------------------+-----------
11 | cabs1,cabs2,cabs3,cabs4 | CA,NY
22 | c1,c2 | DC,LA
(2 rows)
La clé ici est qu'au lieu d'utiliser les fonctions de fenêtre et le patitioning, vous utilisez un GROUP BY
au niveau de la requête et agréger avec un DISTINCT
clause.
Cela fonctionnerait également avec l'approche de la fonction de fenêtre, sauf que PostgreSQL (9.1 au moins) ne prend pas en charge DISTINCT
dans les fonctions de la fenêtre :
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...