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;