我有一张这样的桌子
Movie Actor
A 1
A 2
A 3
B 4
我想获取电影的名称和该电影中的所有演员,并且我希望结果采用如下格式:
Movie ActorList
A 1, 2, 3
我该怎么做?
我有一张这样的桌子
Movie Actor
A 1
A 2
A 3
B 4
我想获取电影的名称和该电影中的所有演员,并且我希望结果采用如下格式:
Movie ActorList
A 1, 2, 3
我该怎么做?
使用聚合函数更简单string_agg()
(Postgres 9.0 或更高版本):
SELECT movie, string_agg(actor, ', ') AS actor_list
FROM tbl
GROUP BY 1;
在这种情况下, 1
inGROUP 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;
但在子查询中对行进行排序通常更快。看:
您可以array_agg
为此使用函数:
SELECT "Movie",
array_to_string(array_agg(distinct "Actor"),',') AS Actor
FROM Table1
GROUP BY "Movie";
结果:
电影 | 演员 |
---|---|
一种 | 1,2,3 |
乙 | 4 |
有关更多信息,请参阅9.18。聚合函数