追加到postgres中的多维数组

时间:2014-08-11 12:31:01

标签: arrays postgresql multidimensional-array aggregate-functions

我正在尝试创建一个多列聚合函数,需要累积所有列值以供以后处理。

CREATE OR REPLACE FUNCTION accumulate_scores(prev integer[][],l1 integer,
l2 integer,l3 integer) RETURNS integer[][] AS
$$      
BEGIN  
prev[1] = array_append(prev[1],l1);
prev[2] = array_append(prev[2],l2);
prev[3] = array_append(prev[3],l3);
return prev;
END 
$$ LANGUAGE plpgsql;

CREATE AGGREGATE my_aggregate(integer,integer,integer)(
 SFUNC  = accumulate_scores,
 STYPE     = integer[][],
 INITCOND  = '{}'  
);

select accumulate_scores(ARRAY[1]|| ARRAY[[1],[1]],2,3,4);     

我收到此错误

ERROR: function array_append(integer, integer) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.

如何将这些值累积到多维数组中?

编辑:我已尝试使用array_cat并获得相同的错误。以为array_append可能是正确的,因为prev [1]是一个单维数组

2 个答案:

答案 0 :(得分:2)

你的功能&聚合函数将像这样“工作”,但它只会创建一个1维数组:

CREATE OR REPLACE FUNCTION accumulate_scores(prev integer[][]
                                            ,l1 integer
                                            ,l2 integer
                                            ,l3 integer)
  RETURNS integer[][] AS
$func$
BEGIN 
prev := prev || ARRAY[l1,l2,l3];

RETURN prev;
END 
$func$ LANGUAGE plpgsql;

CREATE AGGREGATE my_aggregate(integer,integer,integer)(
 SFUNC     = accumulate_scores,
 STYPE     = integer[][],
 INITCOND  = '{}'  
);

声明RETURNS integer[][]仅相当于RETURNS integer[]。对于Postgres,同一基本元素上的所有数组都是相同的类型。其他括号仅供文档使用,并被忽略。

要实际生成多维数组,您不需要自定义函数。只是一个自定义聚合函数:

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = '{}'
);

然后你可以:

SELECT array_agg_mult(ARRAY[ARRAY[l1,l2,l3]])  -- note the two array layers!
from   tbl;

此处有更多详情:

答案 1 :(得分:0)

这就是我理解问题的方法

select array[
    array_agg(l1),
    array_agg(l2),
    array_agg(l3)
]
from (values
    (1, 9, 1, 2, 3), (2, 9, 4, 5, 6)
) s(id, bar, l1, l2, l3)
group by bar;
        array        
---------------------
 {{1,4},{2,5},{3,6}}