如何将两个 PostgreSQL 列聚合到一个由括号分隔的数组中

问题描述 投票:0回答:2

我想使用分组查询连接两列,产生一个用括号分隔的数组。我知道这个问题与 this 问题相关,但像往常一样,我的用例有点不同。

一个简单的示例(也称为 SQL Fiddle)。 目前我的查询返回以下内容:

ID  X   Y
3   0.5 2.71
3   1.0 2.50
3   1.5 2.33
6   0.5 2.73
6   1.5 2.77

但是我想连接/聚合

X
/
Y
列以获得以下内容:

ID  XY
3   [[0.5,2.71],[1.0,2.50],[1.5,2.33]]
6   [[0.5,2.73],[1.5,2.77]]

目前我尝试将各列连接成一列,如下所示:

SELECT "ID",concat_ws(', ',"X", "Y") as XY FROM Table1;

返回:

ID  xy
3   0.5, 2.71
3   1, 2.50
3   1.5, 2.33
6   0.5, 2.73

并使用

array_agg()

SELECT "ID",array_to_string(array_agg("X"),',') AS XY
FROM Table1
GROUP BY "ID";

结果:

ID  xy
3   0.5,1,1.5
6   0.5

我觉得我越来越接近了,但如果能伸出援助之手,我将不胜感激。

sql arrays postgresql concatenation array-agg
2个回答
68
投票

从两列创建一个数组,聚合数组:

select id, array_agg(array[x,y])
from the_table
group by id;

请注意,数组的默认文本表示使用大括号 (

{..}
) 而不是方括号 (
[..]
)


14
投票

Postgres 9.5 或更高版本

array_agg()
的附加(重载)变体采用数组输入:

SELECT id, array_agg(ARRAY[x, y]) AS xy
FROM   tbl
GROUP  BY id;

说明书:

将所有输入数组连接成一个更高的数组 方面。 (输入必须全部具有相同的维度,并且 不能为空或 null。)

旧版本

您可以创建自己的聚合函数(每个数据库一次)来实现相同的目的:

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
  , STYPE     = anyarray
  , INITCOND  = '{}'
);

然后:

SELECT id, array_agg_mult(ARRAY[ARRAY[x,y]]) AS xy  -- note the 2D array!
FROM   tbl
GROUP  BY id;

详情:

或者您可以连接字符串

SELECT id, '[[' || string_agg(concat_ws(',', x, y), '],[') || ']]' AS xy
FROM   tbl
GROUP  BY id;

准确产生您想要的结果。一个字符串,而不是一个数组。

© www.soinside.com 2019 - 2024. All rights reserved.