array_agg() 是一个系统函数,用于将其输入值收集到一个数组中。
array_agg() 在 PostgreSQL 8.4 中添加。
用法
array_agg (anynonarray) →anyarray
array_agg (anyarray) →anyarray
变更历史
- PostgreSQL 16
- 添加了并行聚合支持 (提交 16fd03e9)
- PostgreSQL 9.5
- 能够接受数组作为输入 (提交 bac27394)
- PostgreSQL 8.4
- 添加 (提交 0a687c8f)
示例
一个简单、人为的例子,将多行聚合到单个连接值数组中
postgres=# SELECT array_agg(x || ' / ' || y)
FROM (values ('foo', 'bar'),
('bar', 'baz')
) _(x, y);
array_agg
-----------------------
{"foo / bar","bar / baz"}
(1 row)
进一步的、人为的例子,将多行中的值聚合到集合中
postgres=# SELECT i, array_agg(x || ' / ' || y)
FROM (values (1, 'foo', 'bar'),
(2, 'boo', 'hoo'),
(2, 'bar', 'baz')
) _(i, x,y)
GROUP BY i;
i | array_agg
---+---------------------------
1 | {"foo / bar"}
2 | {"boo / hoo","bar / baz"}
(2 rows)
使用 ORDER BY (推荐) 来控制生成数组的填充顺序
postgres=# SELECT i, array_agg(x || ' / ' || y ORDER BY x,y)
FROM (values (1, 'foo', 'bar'),
(2, 'zoo', 'yum'),
(2, 'boo', 'hoo'),
(2, 'bar', 'baz')
) _(i, x,y)
GROUP BY i;
i | array_agg
---+---------------------------------------
1 | {"foo / bar"}
2 | {"bar / baz","boo / hoo","zoo / yum"}
(2 rows)
参考资料
- PostgreSQL 文档: 通用聚合函数
