PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verketten Sie mehrere Ergebniszeilen einer Spalte zu einer, gruppieren Sie sie nach einer anderen Spalte

Einfacher mit der Aggregatfunktion string_agg() (Postgres 9.0 oder höher):

SELECT movie, string_agg(actor, ', ') AS actor_list
FROM   tbl
GROUP  BY 1;

Die 1 in GROUP BY 1 ist eine Positionsreferenz und eine Abkürzung für GROUP BY movie in diesem Fall.

string_agg() erwartet den Datentyp text als Eingang. Andere Typen müssen explizit umgewandelt werden (actor::text ) - es sei denn eine implizite Umwandlung in text definiert ist - was bei allen anderen Zeichentypen der Fall ist (varchar , character , "char" ) und einige andere Arten.

Wie isapir kommentierte, können Sie einen ORDER BY hinzufügen -Klausel im Aggregataufruf, um eine sortierte Liste zu erhalten - falls Sie das brauchen. Wie:

SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;

Normalerweise ist es jedoch schneller, Zeilen in einer Unterabfrage zu sortieren. Siehe:

  • Postgres SQL - Array in Select erstellen