Łączenie wielu wierszy wynikowych z jednej kolumny w jedną, grupowanie przez inną kolumnę [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak połączyć ciągi pól string w zapytaniu PostgreSQL 'group by'? (14 odpowiedzi) Zamknięty 7 lat temu .

I ' m having a table like this

Movie   Actor   
  A       1
  A       2
  A       3
  B       4
Chcę uzyskać nazwę filmu i wszystkich aktorów w tym filmie, i chcę, aby wynik był w formacie takim jak ten:]}
Movie   ActorList
 A       1, 2, 3

Jak mogę to zrobić?

Author: ROMANIA_engineer, 2013-04-06

2 answers

Prostsze z funkcją agregacjistring_agg() (Postgres 9.0 lub nowszy):

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

1 w GROUP BY 1 jest odniesieniem pozycyjnym i skrótem GROUP BY movie w tym przypadku.

string_agg() oczekuje typu danych text jako danych wejściowych. Inne rodzaje muszą być wyraźnie rzucane (actor::text) - chyba że zostanie zdefiniowany rzut niejawny do text - tak jest w przypadku wszystkich innych typów znaków(varchar, character, "char"), i inne.

Jako isapir commented , możesz dodać klauzulę ORDER BY w wywołaniu zbiorczym, aby uzyskać posortowaną listę - jeśli tego potrzebujesz. Like:

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

Ale zazwyczaj sortowanie wierszy w zapytaniu podrzędnym jest szybsze. Zobacz:

 263
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-02 22:53:30

Możesz użyć do tego funkcji array_agg:

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

Wynik:

film aktor
A 1,2,3
B 4

Zobacz ten SQLFiddle

Po Więcej Patrz 9.18. Funkcje Zbiorcze

 56
Author: Himanshu Jansari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-08 05:26:00