2013-04-11 5 views
6

kann ich ein Array von Arrays erstellen:Kann nicht Aggregat Arrays

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

Aber ich kann nicht aggregiert Arrays:

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[] 

Was bin ich?

+0

Mögliches Duplikat von http://stackoverflow.com/questions/6782268/array-agg-for-array-types – Akash

Antwort

15

Ich benutze:

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

und Anfragen wie:

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

Beachten Sie, dass 2-dimensionalen Arrays aggregieren müssen, so dass Sie oft in einem Ein- eine Eingangsanordnung wickeln wollen werden Element ARRAY[array_to_aggregate] Array-Konstruktor.

+0

Hier geht eine Frage der Effizienz. Sieht so aus als ob diese quadratische Komplexität haben. – Suor

+0

@Suor 'n (log n)' wahrscheinlich. Für bessere Ergebnisse würden Sie ein entpacktes Array als Zwischenstatus und eine C-Funktion verwenden. –