PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL 9.1 :Comment concaténer des lignes dans un tableau sans doublons, JOINDRE une autre table

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...