我有一张这样的桌子
Movie Actor
A 1
A 2
A 3
B 4
我想获得电影的名称以及该电影中的所有演员,我希望结果的格式如下:
Movie ActorList
A 1, 2, 3
我该怎么做?
答案 0 :(得分:164)
使用聚合函数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
的隐式转换 - 所有其他字符类型都是如此(varchar
,character
,"char"
)和其他一些类型。
作为isapir commented,您可以在聚合调用中添加ORDER BY
子句以获取排序列表 - 如果需要,可以。像:
SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM tbl
GROUP BY 1;
但是在子查询中对行进行排序通常会更快。参见:
答案 1 :(得分:34)
您可以使用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 |
更多信息,请参阅9.18. Aggregate Functions
答案 2 :(得分:-4)
select movie,GROUP_CONCAT(DISTINCT Actor) as ActorList from toyr_table group by movie