2013-04-11 69 views
6

我可以創建一個數組的數組:不能總陣列

select array[array[1, 2], array[3, 4]]; 
    array  
--------------- 
{{1,2},{3,4}} 

但我不能聚集數組:

select array_agg(array[c1, c2]) 
from (
    values (1, 2), (3, 4) 
) s(c1, c2); 
ERROR: could not find array type for data type integer[] 

我缺少什麼?

+0

可能的重複http://stackoverflow.com/questions/6782268/array-agg-for-array-types – Akash 2013-04-11 17:11:18

回答

15

我用:

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

和查詢:

SELECT array_agg_mult(ARRAY[[x,x]]) FROM generate_series(1,10) x; 

請注意,您必須彙總2維數組,所以你經常要在單包的輸入數組元素ARRAY[array_to_aggregate]數組構造函數。

+0

這裏有一個效率問題。看起來這樣會有二次複雜性。可能是 – Suor 2017-06-03 15:08:15

+0

@Su'n(logn)'。爲了獲得更好的結果,你可以使用一個未打包的數組作爲中間狀態和一個C函數。 – 2017-06-06 00:46:25