sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL 9.1:Hur man sammanfogar rader i array utan dubbletter, GÅ MED i en annan tabell

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



  1. Sortera varchar-fält numeriskt i MySQL

  2. Trädstruktur i sql i Oracle. Hur man visar träd, underordnade noder och överordnade noder i SQL Oracle

  3. Hur får man ett datum i formatet ÅÅÅÅ-MM-DD från ett TSQL-datumtidfält?

  4. Hur implementerar man batchhämtning med Fluent NHibernate när man arbetar med Oracle?