2009-02-10 32 views
29

que tienen una mesa construida de esta manera:concatenar varias filas en una matriz con SQL en PostgreSQL

oid | identifier | value 
1 | 10   | 101 
2 | 10   | 102 
3 | 20   | 201 
4 | 20   | 202 
5 | 20   | 203 

me gustaría consultar esta tabla para obtener un resultado como este:

identifier | values[] 
10   | {101, 102} 
20   | {201, 202, 203} 

No puedo encontrar la manera de hacerlo. Es eso posible ? Cómo ?

Muchas gracias.

+0

Ver aquí: http://stackoverflow.com/questions/43870/how-to-concatenate-strings-of-a-string-field-in-a-postgresql-group-by-query – Quassnoi

Respuesta

52

Este es un postgres incorporados desde algunas versiones por lo que ya no tendrá que definir su propio, el nombre es ARRAY_AGG().

test=> select array_agg(n) from generate_series(1,10) n group by n%2; 
    array_agg 
-------------- 
{1,3,5,7,9} 
{2,4,6,8,10} 

(esto es postgres 8.4.8).

Tenga en cuenta que no se especifica ORDER BY, por lo que el orden de las filas de resultados depende del método de agrupación utilizado (aquí, hash), es decir, no está definido. Ejemplo:

test=> select n%2, array_agg(n) from generate_series(1,10) n group by (n%2); 
?column? | array_agg 
----------+-------------- 
     1 | {1,3,5,7,9} 
     0 | {2,4,6,8,10} 

test=> select (n%2)::TEXT, array_agg(n) from generate_series(1,10) n group by (n%2)::TEXT; 
text | array_agg 
------+-------------- 
0 | {2,4,6,8,10} 
1 | {1,3,5,7,9} 

Ahora, yo no sé por qué se obtiene 10,2,4,6,8 {} y {9,7,3,1,5}, ya que generate_series() debe enviar el filas en orden

+0

En PostgreSQL 8.4.8 esto devuelve: {10,2,4,6,8} y { 9,7,3,1,5}. Creo que el resultado anterior es de la versión 9. – SabreWolfy

+0

respuesta editada ... – peufeu

+0

No sé por qué las filas/elementos se devuelven en el orden en que los veo. I acabo de copiar el código y pegarlo para ver qué hizo. – SabreWolfy

16

Debe crear una función de agregado, p.

CREATE AGGREGATE array_accum (anyelement) 
(
sfunc = array_append, 
stype = anyarray, 
initcond = '{}' 
); 

continuación

SELECT identifier, array_accum(value) AS values FROM table GROUP BY identifier; 

HTH

+0

I recibe el siguiente error cuando intenta crear esta función agregada: ERROR: error de sintaxis en o cerca de "(" – SomethingOn

+0

¿Está usando PostgreSQL? – SuN

1

Aquí está el código para la salida solicitada.

select identifier, array_agg(value) 
from (
    values 
    (1 , 10   , 101), 
    (2 , 10   , 102), 
    (3 , 20   , 201), 
    (4 , 20   , 202), 
    (5 , 20   , 203) 
) as tab (oid, identifier, value) 
group by identifier 
order by identifier; 
Cuestiones relacionadas