Объединение нескольких строк результатов из одного столбца в один, группа за другим столбцом

У меня есть таблица вроде этого

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

Я хочу получить имя фильма и всех участников этого фильма, и я хочу, чтобы результат был в таком формате:

Movie   ActorList
 A       1, 2, 3

Как я могу это сделать?

Ответ 1

Упрощен с помощью агрегатной функции string_agg() (Postgres 9.0 или новее):

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

1 в GROUP BY 1 является позиционной ссылкой и ярлыком для GROUP BY movie в этом случае.

string_agg() ожидает ввода text типа данных в качестве ввода. Другие типы должны быть явно заданы (actor::text) - если не определено неявное text в text - это относится ко всем другим типам символов (varchar, character, "char") и некоторым другим типам.

Как прокомментировал isapir, вы можете добавить предложение ORDER BY в агрегированном вызове, чтобы получить отсортированный список - если вам это нужно. Подобно:

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

Но обычно быстрее сортировать строки в подзапросе. Увидеть:

Ответ 2

Вы можете использовать функцию array_agg для этого:

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

Результат:

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

См. Этот SQLFiddle

Подробнее см. 9.18. Совокупные функции