Postgres GROUP BY整数数组

时间:2014-08-05 20:40:17

标签: arrays postgresql aggregate-functions

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,它连接数组并创建一个新数组;

2 个答案:

答案 0 :(得分:4)

SQL Fiddle

首先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;

Here's a demo of this in action on SQLFiddle