sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL 9.1:Jak zřetězit řádky v poli bez duplikátů, PŘIPOJTE SE k jiné tabulce

Namísto použití okenních funkcí a patitioningu použijte GROUP BY na úrovni dotazu a agregujte pomocí klauzule 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;

Výsledek:

 grp_id |        cabinets         | addresses 
--------+-------------------------+-----------
     11 | cabs1,cabs2,cabs3,cabs4 | CA,NY
     22 | c1,c2                   | DC,LA
(2 rows)

Klíčem je zde to, že namísto použití okenních funkcí a patitioningu použijete na úrovni dotazu GROUP BY a agregovat s DISTINCT doložka.

To by fungovalo také s přístupem funkce okna, kromě toho, že PostgreSQL (minimálně 9.1) nepodporuje DISTINCT ve funkcích okna:

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. Jak funguje funkce RPAD() v MySQL

  2. Nejčastější chyby, kterým je třeba se vyhnout při replikaci MySQL

  3. 5 způsobů, jak získat krátký název měsíce z data na serveru SQL

  4. .NET Core 2.1 Identity získá všechny uživatele s jejich přidruženými rolemi