PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL 9.1:Как да свържете редове в масив без дубликати, ПРИСЪЕДИНЕТЕ се към друга таблица

Вместо да използвате функциите на прозореца и patitioning, използвайте GROUP BY на ниво заявка и агрегирайте с клауза 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;

Резултат:

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

Ключът тук е, че вместо да използвате функциите на прозореца и patitioning, вие използвате GROUP BY на ниво заявка и агрегирайте с DISTINCT клауза.

Това би работило и с подхода на функцията на прозореца, с изключение на това, че PostgreSQL (поне 9.1) не поддържа DISTINCT в функциите на прозореца:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2:вмъкване на няколко реда с една заявка

  2. Ръководство за PGpool - съвети и наблюдения:част трета

  3. Функции за дата и час на PostgreSQL

  4. Как да освободя възможни заключвания на редове на Postgres?

  5. Уебинар:Банкиране на Postgres – Съображения за финансово приложение [Последващи стъпки]