wake-up-neo.net

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

Ich habe einen Tisch wie diesen

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

Ich möchte den Namen eines Films und aller Schauspieler in diesem Film erhalten und möchte, dass das Ergebnis in einem Format wie dem folgenden vorliegt:

Movie   ActorList
 A       1, 2, 3

Wie kann ich es tun?

106
Chin

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;

Das 1 In GROUP BY 1 Ist in diesem Fall eine Positionsreferenz und eine Abkürzung für GROUP BY movie.

string_agg() erwartet den Datentyp text als Eingabe. Andere Typen müssen explizit umgewandelt werden (actor::text) - es sei denn eine implizite Umwandlung in text ist definiert - dies gilt für alle anderen Zeichentypen (varchar, character, "char") und einige andere Typen.

Als isapir commented können Sie eine ORDER BY - Klausel in den Aggregataufruf einfügen, um eine sortierte Liste zu erhalten - falls Sie diese benötigen. Mögen:

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

In der Regel ist es jedoch schneller, Zeilen in einer Unterabfrage zu sortieren. Sehen:

178

Sie können array_agg Funktion dafür:

SELECT "Movie",
array_to_string(array_agg(distinct "Actor"),',') AS Actor
FROM Table1
GROUP BY "Movie";

Ergebnis:

| MOVIE | ACTOR |
-----------------
|     A | 1,2,3 |
|     B |     4 |

Siehe this SQLFiddle

Weitere Informationen finden Sie unter 9.18. Aggregatfunktionen

39
hims056