PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL 9.1:So verketten Sie Zeilen in einem Array ohne Duplikate, JOIN einer anderen Tabelle

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