PostgreSQL group_concat equivalente?
-
23-09-2019 - |
Domanda
Ho una tabella e mi piacerebbe tirare una riga per id con i valori dei campi concatenati.
Nel mio tavolo, per esempio, ho questa:
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
E mi piacerebbe uscita:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
In MySQL sono stato in grado di utilizzare la funzione di GROUP_CONCAT
aggregata, ma che non sembra lavoro qui ... c'è un equivalente per PostgreSQL, o in un altro modo per ottenere questo?
Soluzione
Questo è probabilmente un buon punto di partenza (versione 8.4+ only):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg restituisce un array, ma si può lanciare quella di testo e modificare, se necessario (vedi chiarimenti, di seguito).
Prima della versione 8.4, è necessario definire da soli prima dell'uso:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(parafrasato dalla documentazione di PostgreSQL)
Chiarimenti:
- Il risultato del casting un array di testo è che le risultanti stringa inizia e termina con parentesi graffe. Tali bretelle devono essere rimosse da un metodo, se non sono desiderati.
- Casting anyarray al miglior testo simula uscita CSV come elementi che contengono incorporati virgole sono due citato in uscita in grande stile CSV standard. Né array_to_string () o string_agg () (la funzione "group_concat", ha aggiunto in 9.1) stringhe di citazione con virgole incorporate, con conseguente un numero errato di elementi nella lista risultante.
- La nuova funzione 9.1 string_agg () non getta i risultati interni al testo prima. Quindi, "string_agg (value_field)" potrebbe generare un errore se value_field è un numero intero. "String_agg (value_field :: testo)" sarebbe necessario. Il metodo array_agg () richiede un solo getto dopo l'aggregazione (anziché un getto per valore).
Altri suggerimenti
Dal 9,0 questo è ancora più semplice:
SELECT id,
string_agg(some_column, ',')
FROM the_table
GROUP BY id
SELECT array_to_string(array(SELECT a FROM b),', ');
Lo farò pure.
Prova in questo modo:
select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
e la versione per il lavoro sul tipo di matrice :
select
array_to_string(
array(select distinct unnest(zip_codes) from table),
', '
);
Il mio suggerimento in 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