équivalent Postgresql GROUP_CONCAT?
-
23-09-2019 - |
Question
J'ai une table et je voudrais tirer une ligne par id avec les valeurs de champ concaténer.
Dans ma table, par exemple, j'ai ceci:
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
Et je voudrais sortie:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
En MySQL j'ai pu utiliser la fonction d'agrégation GROUP_CONCAT
, mais cela ne semble pas fonctionner ici ... Y at-il un équivalent pour PostgreSQL, ou d'une autre façon d'y parvenir?
La solution
Ceci est probablement un bon point de départ (version 8.4+ uniquement):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg retourne un tableau, mais vous pouvez CAST que texte et modifier au besoin (voir précisions ci-dessous).
Avant la version 8.4, vous devez définir vous-même avant d'utiliser:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(paraphrase de la documentation PostgreSQL)
Clarifications:
- Le résultat de la coulée d'un tableau de texte est que le début de la chaîne résultante et se termine par des accolades. Ces accolades doivent être enlevés par une méthode, si elles ne sont pas désirées.
- Castings anyarray à TEXT simule mieux sortie CSV comme des éléments contenant des virgules sont intégrés à double cité dans la sortie dans le style standard CSV. Ni array_to_string () ou string_agg () (la fonction « group_concat » ajoutée 9.1) des chaînes de guillemets par des virgules intégrées, entraînant un nombre incorrect d'éléments dans la liste de résultats.
- La nouvelle fonction 9.1 string_agg () ne rejette pas les résultats internes au premier texte. Donc, « string_agg (value_field) » générerait une erreur si value_field est un entier. "String_agg (value_field :: texte)" serait nécessaire. La méthode de array_agg () nécessite uniquement une fonte après l'agrégation (plutôt que d'un moulage par valeur).
Autres conseils
Depuis 9.0 ceci est encore plus facile:
SELECT id,
string_agg(some_column, ',')
FROM the_table
GROUP BY id
SELECT array_to_string(array(SELECT a FROM b),', ');
fera aussi bien.
Essayez comme ceci:
select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
et la version pour travailler sur le type de tableau :
select
array_to_string(
array(select distinct unnest(zip_codes) from table),
', '
);
Ma suggestion 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