PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL 9.1:Como concatenar linhas em array sem duplicatas, JOIN outra tabela


Em vez de usar funções de janela e patitioning, use um GROUP BY no nível de consulta e agregue com uma cláusula 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;

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

A chave aqui é que, em vez de usar funções de janela e patition, você usa um GROUP BY no nível de consulta e agregar com um DISTINCT cláusula.

Isso também funcionaria com a abordagem da função de janela, exceto que o PostgreSQL (9.1 pelo menos) não suporta DISTINCT nas funções da janela:
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...