Pergunta

Eu tenho uma tabela e gostaria de extrair uma linha por ID com valores de campo concatenados.

Na minha tabela, por exemplo, tenho isto:

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 consegui usar a função agregada GROUP_CONCAT, mas isso não parece funcionar aqui ...Existe um equivalente para o PostgreSQL ou outra maneira de fazer isso?

Foi útil?

Solução

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

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

Array_agg Retorna uma matriz, mas você pode lançar isso para enviar e editar conforme necessário (veja esclarecimentos, abaixo).

Antes da versão 8.4, você deve defini -lo antes do uso:

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

(parafraseado da documentação do PostgreSQL)

Esclarecimentos:

  • O resultado do lançamento de uma matriz no texto é que a string resultante começa e termina com aparelhos encaracolados. Esses aparelhos precisam ser removidos por algum método, se não forem desejados.
  • O lançamento de AnyArray para o texto melhor simula a saída CSV como elementos que contêm vírgulas incorporadas são citadas duas vezes na saída no estilo CSV padrão. Nem array_to_string () ou string_agg () (a função "group_concat" adicionada em 9.1) strings de citação com vírgulas incorporadas, resultando em um número incorreto de elementos na lista resultante.
  • A nova função 9.1 string_agg () não lança os resultados internos para o texto primeiro. Então "String_agg (value_field)" geraria um erro se o value_field for um número inteiro. "String_agg (value_field :: text)" seria necessário. O método Array_Agg () requer apenas um elenco após a agregação (em vez de um elenco por valor).

Outras dicas

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),', ');

Também servirei.

Tente assim:

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

e a versão para trabalhar no Tipo de matriz:

select
  array_to_string(
    array(select distinct unnest(zip_codes) from table),
    ', '
);

Minha sugestão em 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   
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top