Łączenie wielu wierszy wynikowych z jednej kolumny w jedną, grupowanie przez inną kolumnę [duplikat]
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ć?
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:
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
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