如何将两个 PostgreSQL 列聚合到一个用方括号分隔的数组
How to aggregate two PostgreSQL columns to an array separated by brackets
我想使用分组查询连接两列,生成一个用方括号分隔的数组。我知道这个问题与 this 问题有关,但像往常一样,我的用例有点不同。
一个简单的例子(也如SQL Fiddle)。
目前我的查询returns如下:
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
但我希望 concatenate/aggregate 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;
哪个returns:
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
我觉得我离我越来越近了,但真的很感激伸出援助之手。
从两列创建一个数组,聚合数组:
select id, array_agg(array[x,y])
from the_table
group by id;
请注意,数组的默认文本表示使用大括号 ({..}
) 而不是方括号 ([..]
)
在 Postgres 9.5 或更高版本 array_agg()
中采用 数组 作为输入以允许简单语法 :
SELECT id, array_agg(ARRAY[x, y]) AS xy
FROM Table1
GROUP BY id;
在旧版本中,这还没有实现。您可以创建自己的聚合函数(一次)来实现相同的目的:
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 Table1
GROUP BY id;
详情:
- Selecting data into a Postgres array
或者您可以连接一个字符串:
SELECT id, '[[' || string_agg(concat_ws(',', x, y), '],[') || ']]' AS xy
FROM Table1
GROUP BY id;
准确地产生您想要的结果。字符串,不是数组。
我想使用分组查询连接两列,生成一个用方括号分隔的数组。我知道这个问题与 this 问题有关,但像往常一样,我的用例有点不同。
一个简单的例子(也如SQL Fiddle)。 目前我的查询returns如下:
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
但我希望 concatenate/aggregate 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;
哪个returns:
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
我觉得我离我越来越近了,但真的很感激伸出援助之手。
从两列创建一个数组,聚合数组:
select id, array_agg(array[x,y])
from the_table
group by id;
请注意,数组的默认文本表示使用大括号 ({..}
) 而不是方括号 ([..]
)
在 Postgres 9.5 或更高版本 array_agg()
中采用 数组 作为输入以允许简单语法
SELECT id, array_agg(ARRAY[x, y]) AS xy
FROM Table1
GROUP BY id;
在旧版本中,这还没有实现。您可以创建自己的聚合函数(一次)来实现相同的目的:
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 Table1
GROUP BY id;
详情:
- Selecting data into a Postgres array
或者您可以连接一个字符串:
SELECT id, '[[' || string_agg(concat_ws(',', x, y), '],[') || ']]' AS xy
FROM Table1
GROUP BY id;
准确地产生您想要的结果。字符串,不是数组。