Postgres 9.3中的我的数据库表
| f1|f2 | f3
| 1 | 2 | {1,2,3}
| 1 | 3 | {4,5}
f1,f2是整数f3是整数[]。
我怎样才能得到这个:
SELECT f1, myfn(f3)
FROM dbTable
GROUP BY f1;
所以我得到:
| 1 | {1,2,3,4,5}
在postgres中是否有类似的函数,如array_agg,它连接数组并创建一个新数组;
答案 0 :(得分:4)
首先unnest
然后聚合
select f1, array_agg(f3) as f3
from (
select f1, unnest(f3) as f3
from dbtable
) s
group by f1
为避免重复和排序输出(必须安装intarry扩展名):
select f1, sort(uniq(array_agg(f3))) as f3
from (
select f1, unnest(f3) as f3
from dbtable
) s
group by f1
答案 1 :(得分:4)
我认为没有a built-in aggregate function,但您可以轻松创建自己的。{3}}。
查看the array functions and operators available,您想要的函数是array_cat
- 运算符||
通常更方便,但我们需要一个函数来创建聚合,否则必须包装它在一个。
由于我们已经有了一个可以使用的函数,我们可以基于它创建一个非常简单的聚合 - 从一个空数组开始,依次连接每个新项,并且不需要特殊的中间数据或最终步骤。
CREATE AGGREGATE
statement如下(注意使用the anyarray
pseudo-type作为聚合的输入和输出):
CREATE AGGREGATE array_cat_agg(anyarray) (
SFUNC=array_cat,
STYPE=anyarray,
INITCOND='{}'
);
这应该可以让你准确写出你想要的东西:
SELECT f1, array_cat_agg(f3)
FROM dbTable
GROUP BY f1;