【问题标题】:PostgreSQL array_agg(INTEGER[])PostgreSQL array_agg(INTEGER[])
【发布时间】:2018-04-01 15:11:57
【问题描述】:

使用 Postgres 9.5,我想连接来自 GROUP BY 的整数数组。从文档看来,array_agg 应该能够做到这一点,但我得到:ERROR: cannot accumulate arrays of different dimensionality

在我的测试集上使用 array_dims 我得到 [1:18]、[1:24] 和 [1:48]。我将其视为 3 个不同长度的一维数组。结果应该是一个维度为 [1:90] 我在这里缺少什么?

【问题讨论】:

  • IIRC array_agg 用于将分组值连接到单个数组中,而不是连接数组。
  • array_agg 将行聚合到数组 - 例如 select array_agg(oid) from pg_database
  • array_agg 正在尝试执行此操作array[array[1:18], array[1:24], array[1:48]],这不是有效的多维数组。您需要编写自己的聚合来连接数组。
  • 在进一步研究之后,我看到它在做什么: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}
  • 我不觉得我完全明白为什么最后不是 [3:90]..

标签: sql postgresql


【解决方案1】:

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

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)

【讨论】:

  • 谢谢。这太简单了,我想知道为什么这不是标准功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2021-11-26
相关资源
最近更新 更多