248 votos

Equivalente Postgresql GROUP_CONCAT?

Tengo una tabla y me gustaría tirar una fila por id con valores de campo concatenados ... En mi mesa, por ejemplo, tengo esto:

 TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
 

Y, me gustaría de salida:

 TM67| 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
 

En MySQL, tuve la oportunidad de utilizar GROUP_CONCAT, pero eso no parece funcionar aquí ... ¿Hay una manera u otra equivalente para lograr esto?

256voto

a_horse_with_no_name Puntos 100769

Desde 9,0 esto es aún más fácil:

 SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id
 

237voto

Matthew Wood Puntos 4485

Este es probablemente un buen punto de partida (la versión 8.4+ solamente):

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field

array_agg devuelve una matriz, pero usted puede lanzar ese texto y modificar, según sea necesario (ver aclaraciones, a continuación).

Antes de la versión 8.4, te defines a ti mismo antes de su uso:

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

(resumen de la documentación de PostgreSQL)

Aclaraciones:

  • El resultado de la fundición de una matriz a de texto es que la cadena resultante se inicia y termina con llaves. Las llaves deben ser eliminadas por algún método, si no son los deseados.
  • Casting ANYARRAY de TEXTO que mejor simula la salida CSV como elementos que contienen incrustado comas son de doble citado en la salida estándar CSV estilo. Ni array_to_string() o string_agg() (la "group_concat" la función de agregado en 9.1) cita las cadenas con comas incrustadas, lo que resulta en un número incorrecto de los elementos de la lista resultante.
  • El nuevo 9.1 string_agg() la función NO emitir el interior de resultados de TEXTO. Así que "string_agg(value_field)" generaría un error si value_field es un entero. "string_agg(value_field::text)" sería necesario. El array_agg() método sólo requiere una emitidos después de la agregación (en lugar de un yeso por valor).

48voto

genobis Puntos 546
 SELECT array_to_string(array(SELECT a FROM b),', ');
 

Hará también.

15voto

max_spy Puntos 1

Trate de esta manera:

 select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X