PostgreSQL array_agg(INTEGER[])

6
使用Postgres 9.5,我要对GROUP BY中的整数数组进行连接。从文档中可以看出,array_agg应该能够做到这一点,但是我得到了错误消息:ERROR: cannot accumulate arrays of different dimensionality
在我的测试集上使用array_dims,我得到了[1:18],[1:24]和[1:48]。我将其视为三个不同长度的一维数组。结果应该是一个维度为[1:90]的单个数组。我在这里缺失了什么?

array_agg将行聚合到数组中 - 例如 select array_agg(oid) from pg_database - Vao Tsun
array_agg 正试图执行 array[array[1:18], array[1:24], array[1:48]],但这不是有效的多维数组。您需要编写自己的聚合函数来连接数组。 - Łukasz Kamiński
经过进一步的研究,我发现它在做什么:array_agg({1,2,3},{4,5,6},{7,8,9}) => {{1,4,7},{2,5,8},{3,6,9}}。是否有一个聚合函数可以连接这样的数组,使得 ?_agg({1},{2,3},{4,5,6}) => {1,2,3,4,5,6} - Derek
我觉得我并没有完全理解为什么最终结果不是[3:90]。 - Vao Tsun
谢谢。pg10提供了什么,我在文档中看不到任何东西。 - Derek
显示剩余5条评论
1个回答

11

继续评论中的讨论,我的个人建议是创建聚合。

CREATE AGGREGATE array_concat_agg(anyarray) (
  SFUNC = array_cat,
  STYPE = anyarray
);

然后你可以这样做:

SELECT column1
  FROM (VALUES (array[1,2,3]), (array[3,4]), (array[53,43,33,22])) arr;
    column1
---------------
 {1,2,3}
 {3,4}
 {53,43,33,22}
(3 rows)

SELECT array_concat_agg(column1)
  FROM (VALUES (array[1,2,3]), (array[3,4]), (array[53,43,33,22])) arr;
    array_concat_agg
-------------------------
 {1,2,3,3,4,53,43,33,22}
(1 row)

谢谢。这么简单,我想知道为什么这不是一个标准函数。 - Derek
如果您使用的是v14+,您可能需要进行微调。https://www.postgresql.org/message-id/3266664.1633045937%40sss.pgh.pa.us - Adam D.
1
如果将它改为以下形式,则它将适用于v14+:CREATE or replace AGGREGATE array_concat_agg(anycompatiblearray) ( SFUNC = array_cat, STYPE = anycompatiblearray ); 否则可以嵌套array_cats:select array_cat(ARRAY[1,2,3], ARRAY[4,5]) - Adam D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接