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

Mat*_*ijn 14 sql arrays postgresql concatenation array-agg

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

一个简单的例子(也作为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
Run Code Online (Sandbox Code Playgroud)

但是我希望连接/聚合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]]
Run Code Online (Sandbox Code Playgroud)

目前我已经尝试将列连接成一个如下:

SELECT "ID",concat_ws(', ',"X", "Y") as XY FROM Table1;
Run Code Online (Sandbox Code Playgroud)

哪个回报:

ID  xy
3   0.5, 2.71
3   1, 2.50
3   1.5, 2.33
6   0.5, 2.73
Run Code Online (Sandbox Code Playgroud)

用过array_agg():

SELECT "ID",array_to_string(array_agg("X"),',') AS XY
FROM Table1
GROUP BY "ID";
Run Code Online (Sandbox Code Playgroud)

导致:

ID  xy
3   0.5,1,1.5
6   0.5
Run Code Online (Sandbox Code Playgroud)

我觉得我越来越近了,但是我会非常感激.

a_h*_*ame 18

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

select id, array_agg(array[x,y])
from the_table
group by id;
Run Code Online (Sandbox Code Playgroud)

请注意,数组的默认文本表示使用花括号({..})而不是方括号([..])

  • 此外,x和y的类型应该相同,即如果x是text,那么y也应该是text类型.如果没有,需要使用类型case.(:: text) (2认同)

Erw*_*ter 5

在Postgres 9.5或更高版本中, array_agg()数组作为输入以允许@a_horse提供的简单语法:

SELECT id, array_agg(ARRAY[x, y]) AS xy
FROM   Table1
GROUP  BY id;
Run Code Online (Sandbox Code Playgroud)

旧版本中,尚未实现。您可以创建自己的聚合函数(一次)以实现相同的目的:

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
  , STYPE     = anyarray
  , INITCOND  = '{}'
);
Run Code Online (Sandbox Code Playgroud)

然后:

SELECT id, array_agg_mult(ARRAY[ARRAY[x,y]]) AS xy  -- note the 2D array
FROM   Table1
GROUP  BY id;
Run Code Online (Sandbox Code Playgroud)

细节:

或者,您可以连接一个字符串:

SELECT id, '[[' || string_agg(concat_ws(',', x, y), '],[') || ']]' AS xy
FROM   Table1
GROUP  BY id;
Run Code Online (Sandbox Code Playgroud)

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