我正在使用PostgreSQL 9.1,需要帮助将多行连接到一个行中.我需要两张桌子.当我使用两个乘以array_agg()的函数时,我得到的结果是重复的值.

桌子:

CREATE TABLE rnp (id int, grp_id int, cabinets varchar(15) );

INSERT INTO rnp VALUES
 (1,'11','cabs1')
,(2,'11','cabs2')
,(3,'11','cabs3')
,(4,'11','cabs4')
,(5,'22','c1')
,(6,'22','c2');

CREATE TABLE ips (id int, grp_id int, address varchar(15));

INSERT INTO ips VALUES
 (1,'11','NY')
,(2,'11','CA')
,(3,'22','DC')
,(4,'22','LA');

SQL:

SELECT DISTINCT

  rnp.grp_id,
  array_to_string(array_agg(rnp.cabinets)OVER (PARTITION BY rnp.grp_id), ',') AS cabinets,
  array_to_string(array_agg(ips.address) OVER (PARTITION BY ips.grp_id), ',') AS addresses


FROM rnp JOIN ips ON rnp.grp_id=ips.grp_id

结果:

GRP_ID  CABINETS                                             ADDRESSES
11  cabs1,cabs1,cabs2,cabs2,cabs3,cabs3,cabs4,cabs4     NY,CA,NY,CA,NY,CA,NY,CA
22  c1,c1,c2,c2                                             DC,LA,DC,LA

And what I need is:

 GRP_ID     CABINETS                 ADDRESSES
    11  cabs1,cabs2,cabs3,cabs4       NY,CA,
    22  c1,c2                         DC,LA

SQLFiddle中的示例:http://sqlfiddle.com/#!1/4815e/19

如果只使用一个表——SQLFIDLE:http://sqlfiddle.com/#!1/4815e/20,则没有问题

我错过了什么?因为JOIN,有可能这样做吗?

推荐答案

使用查询级别的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)

这里的关键是,不要使用窗口函数和分页,而是使用查询级别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...

Postgresql相关问答推荐

如何在gorm中创建一个可读但不可写的字段

在Docker容器内的Postgres,如何通过Promail将JSON登录到Loki?

忽略 split_part 的第 n 个分隔符之后

右连接 postgresql 出现语法错误

带有附加组的时间刻度 interpolated_average

postgres 如何计算多列哈希?

Supabase 数据库大小问题

如何将 JSONB 对象数组合并为 PostgreSQL 中的单个对象

Postgis 不只使用索引扫描

psql中set、\set和\pset的区别

如何从 postgresql Select 查询中的 age() 函数中仅获取年份

Select 日期最高的行

SQL:当谈到 NOT IN 和 NOT EQUAL TO 时,哪个更有效,为什么?

Redis 可以写出到像 PostgreSQL 这样的数据库吗?

如何在 postgres 中使用 json_populate_recordset 解析 json

SqlAlchemy:多列的不同计数

Postgresql 中的 NOT EXISTS 子句

如何更改 PostgreSQL 中的日期样式?

如何在创建数据库时安装 Postgres 扩展?

在 OS X 上使用 Postgres.app 时如何将 psql 放在路径上?