175

我有一张这样的桌子

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

我想获取电影的名称和该电影中的所有演员,并且我希望结果采用如下格式:

Movie   ActorList
 A       1, 2, 3

我该怎么做?

4

2 回答 2

319

使用聚合函数更简单string_agg()(Postgres 9.0 或更高版本):

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

在这种情况下, 1inGROUP BY 1是位置参考和快捷方式GROUP BY movie

string_agg()期望数据类型text作为输入。其他类型需要显式转换 ( actor::text) -除非定义了隐式转换text- 所有其他字符类型 ( varchar, character, "char") 和其他一些类型都是这种情况。

正如isapir 评论的那样,您可以ORDER BY在聚合调用中添加一个子句以获取排序列表 - 如果您需要的话。像:

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

但在子查询中对行进行排序通常更快。看:

于 2013-04-06T11:44:03.763 回答
72

您可以array_agg为此使用函数:

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

结果:

电影 演员
一种 1,2,3
4

看到这个 SQLFiddle

有关更多信息,请参阅9.18。聚合函数

于 2013-04-06T05:10:06.493 回答