Postgresql GROUP_CONCAT equivalente?

Eu tenho uma tabela e gostaria de puxar uma linha por id com valores de campo concatenados.

Na minha tabela, por exemplo, eu tenho isso:

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

E eu gostaria de produzir:

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

No MySQL eu era capaz de usar a function agregada GROUP_CONCAT , mas isso não parece funcionar aqui … Existe um equivalente para o PostgreSQL, ou outra maneira de fazer isso?

Este é provavelmente um bom ponto de partida (versão 8.4 + apenas):

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

array_agg retorna um array, mas você pode usar CAST para texto e editar conforme necessário (veja os esclarecimentos abaixo).

Antes da versão 8.4, você deve definir você mesmo antes de usar:

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

(parafraseado da documentação do PostgreSQL)

Esclarecimentos:

  • O resultado de converter uma matriz em texto é que a cadeia resultante começa e termina com chaves. Essas chaves precisam ser removidas por algum método, se não forem desejadas.
  • Transmitir ANYARRAY para TEXT melhor simula a saída CSV, pois os elementos que contêm vírgulas incorporadas têm aspas duplas na saída no estilo CSV padrão. Nem array_to_string () ou string_agg () (a function “group_concat” adicionada no 9.1) citam strings com vírgulas incorporadas, resultando em um número incorreto de elementos na lista resultante.
  • A nova function 9.1 string_agg () NÃO converte os resultados internos para TEXT primeiro. Então, “string_agg (value_field)” geraria um erro se value_field for um inteiro. “string_agg (value_field :: text)” seria necessário. O método array_agg () requer apenas um conversão após a agregação (em vez de um conversão por valor).

Desde 9.0, isso é ainda mais fácil:

 SELECT id, string_agg(some_column, ',') FROM the_table GROUP BY id 
 SELECT array_to_string(array(SELECT a FROM b),', '); 

Fará também.

Tente assim:

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