string_agg postgres group_concat example array_agg array agg sql postgresql group-concat string-aggregation

sql - postgres - string_agg



¿Postgresql GROUP_CONCAT equivalente? (5)

Este es probablemente un buen punto de partida (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 puede CAST para array_agg un texto y editar según sea necesario (consulte las aclaraciones a continuación).

Antes de la versión 8.4, debe definirla usted mismo antes de usar:

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

(Parafraseado de la documentación de PostgreSQL)

Aclaraciones:

  • El resultado de convertir una matriz en texto es que la cadena resultante comienza y termina con llaves. Esos frenos deben ser eliminados por algún método, si no son deseados.
  • La conversión de ANYARRAY to TEXT simula mejor la salida CSV, ya que los elementos que contienen comas incrustadas tienen una doble cita en la salida en el estilo CSV estándar. Ni array_to_string () ni string_agg () (la función "group_concat" agregada en 9.1) citan cadenas con comas incrustadas, lo que resulta en un número incorrecto de elementos en la lista resultante.
  • La nueva función 9.1 string_agg () NO convierte los resultados internos a TEXTO primero. Entonces "string_agg (value_field)" generaría un error si value_field es un número entero. "string_agg (value_field :: text)" sería requerido. El método array_agg () requiere solo una conversión después de la agregación (en lugar de una conversión por valor).

Tengo una tabla y me gustaría extraer una fila por ID con los 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 dar salida:

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

En MySQL pude usar la función agregada GROUP_CONCAT , pero eso no parece funcionar aquí ... ¿Existe un equivalente para PostgreSQL, u otra forma de lograr esto?


Mi sugerencia en postgresql

SELECT cpf || '';'' || nome || '';'' || telefone FROM ( SELECT cpf ,nome ,STRING_AGG(CONCAT_WS( '';'' , DDD_1, TELEFONE_1),'';'') AS telefone FROM ( SELECT DISTINCT * FROM temp_bd ORDER BY cpf DESC ) AS y GROUP BY 1,2 ) AS x


Prueba de esta manera:

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


Desde 9.0 esto es aún más fácil:

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


SELECT array_to_string(array(SELECT a FROM b),'', '');

Lo hará también.