2013-04-11 15 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

答えて

15

は、私が使用します。

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

とクエリのように:あなたは、多くの場合、シングルで入力配列をラップしたいと思うので、あなたは、2次元配列を集約しなければならない

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

注意要素ARRAY[array_to_aggregate]配列コンストラクタ。

+0

ここでは効率の問題があります。これは二次的な複雑さを持つように見えます。 – Suor

+0

@Suor 'n(log n)'おそらく。より良い結果を得るには、アンパックされた配列を中間状態として使用し、C関数を使用します。 –