添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
多个数组聚合为一维数组,求PC。业务背景见:

《PostgreSQL APP海量FEED LOG实时质量统计CASE(含percentile_disc)》

由于PostgreSQL内置的聚合函数array_agg支持的数组聚合实际上是将多个数组聚合为多维数组。并不是一维数组。

postgres=# select array_agg(arr) from (values(array[1,2,3]), (array[4,5,6])) t(arr);
array_agg

{{1,2,3},{4,5,6}}
(1 row)
而实际上我们要的是一维数组的结果

{1,2,3,4,5,6}
此时需要自定义一个聚合函数

create aggregate arragg (anyarray) (sfunc = array_cat, stype=anyarray, PARALLEL=safe);

postgres=# select arragg(arr) from (values(array[1,2,3]), (array[4,5,6])) t(arr);
arragg

{1,2,3,4,5,6}
(1 row)
但是这个新加的聚合用到了array_cat,大量的memcpy导致性能并不好。

array_agg性能对比arragg 聚合100万个元素.http://click.aliyun.com/m/1000005546/