将一列的多个结果行连接为一列,按另一列分组

我有一张这样的桌子

Movie   Actor
A       1
A       2
A       3
B       4

我想要得到一部电影的名字和这部电影中的所有演员,我希望结果是这样的格式:

Movie   ActorList
A       1, 2, 3

我该怎么做呢?

285648 次浏览

你可以使用array_agg函数来实现:

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

结果:

电影 演员
一个 1、2、3
B 4

看到这SQLFiddle

更多信息请参见9.18. 聚合函数

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

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

在本例中,GROUP BY 1中的1是位置引用,也是GROUP BY movie的快捷方式。

string_agg()期望数据类型text作为输入。其他类型需要显式强制转换(actor::text) - 除非定义了隐式强制转换为text -这是所有其他字符串类型(varcharcharactername,…)和其他一些类型的情况。

作为isapir评论,你可以在聚合调用中添加一个ORDER BY子句来获得一个排序的列表——如果你需要的话。如:

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

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