it-swarm.com.de

Postgresql GROUP_CONCAT-Äquivalent?

Ich habe eine Tabelle und ich möchte pro Zeile eine Zeile mit verketteten Feldwerten ziehen.

In meiner Tabelle habe ich zum Beispiel Folgendes:

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

Und ich würde gerne ausgeben:

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

In MySQL konnte ich die Aggregatfunktion GROUP_CONCAT verwenden, aber das scheint hier nicht zu funktionieren.

201
TwixxyKit

Dies ist wahrscheinlich ein guter Ausgangspunkt (nur Version 8.4+):

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

array_agg gibt ein Array zurück, aber Sie können es CAST, um einen Text zu erstellen und nach Bedarf zu bearbeiten (siehe Erläuterungen unten).

Vor Version 8.4 müssen Sie sie vor der Verwendung selbst definieren:

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

(Umschreibung aus der PostgreSQL-Dokumentation)

Klarstellungen:

  • Das Ergebnis der Umwandlung eines Arrays in Text ist, dass die resultierende Zeichenfolge mit geschweiften Klammern beginnt und endet. Diese Klammern müssen auf irgendeine Weise entfernt werden, wenn sie nicht erwünscht sind. 
  • Bei der Umwandlung von ANYARRAY in TEXT wird die CSV-Ausgabe am besten simuliert, da Elemente, die eingebettete Kommas enthalten, in der Ausgabe im Standard-CSV-Stil in doppelte Anführungszeichen gesetzt werden. Weder array_to_string () noch string_agg () (die in 9.1 hinzugefügte Funktion "group_concat") zitiert Zeichenfolgen mit eingebetteten Kommas, was zu einer falschen Anzahl von Elementen in der Ergebnisliste führt.
  • Die neue 9.1-Funktion string_agg () wandelt die inneren Ergebnisse NICHT zuerst in TEXT um. "String_agg (value_field)" würde also einen Fehler erzeugen, wenn value_field eine Ganzzahl ist. "string_agg (value_field :: text)" wäre erforderlich. Die array_agg () -Methode erfordert nur eine Umwandlung nach der Aggregation (und nicht eine Umwandlung pro Wert).
194
Matthew Wood

Seit 9.0 das ist noch einfacher:

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

Werde es auch tun.

38
genobis

Versuchen Sie es so:

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

und die Version für den Array-Typ :

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

Mein Vorschlag 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   
0
Lucas Cabral