Sql 将一列的多个结果行连接到一个列中,并按另一列分组

Sql 将一列的多个结果行连接到一个列中,并按另一列分组,sql,postgresql,aggregate-functions,Sql,Postgresql,Aggregate Functions,我有一张这样的桌子 Movie Actor A 1 A 2 A 3 B 4 我想得到一部电影的名字和该电影中的所有演员,我希望结果的格式如下: Movie ActorList A 1, 2, 3 我该怎么做呢?您可以使用array\u agg函数: SELECT "Movie", array_to_string(array_agg(distinct "Actor"

我有一张这样的桌子

Movie   Actor   
  A       1
  A       2
  A       3
  B       4
我想得到一部电影的名字和该电影中的所有演员,我希望结果的格式如下:

Movie   ActorList
 A       1, 2, 3

我该怎么做呢?

您可以使用
array\u agg
函数:

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

电影 演员 A. 1,2,3 B 4.
聚合函数更简单(Postgres 9.0或更高版本):

在这种情况下,
groupby 1
中的
1
是一个位置参考,也是
groupby movie
的快捷方式

string\u agg()
需要数据类型
text
作为输入。其他类型需要显式强制转换(
actor::text
)-除非定义了对
text
的隐式强制转换-这是所有其他字符类型(
varchar
character
“char”
)和一些其他类型的情况

如有必要,您可以在聚合调用中添加一个
orderby
子句来获得排序列表。比如:

SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;
选择电影,字符串(演员,,“按演员排序”)作为演员列表
来自tbl
分组1例
但对子查询中的行进行排序通常更快。见:


然后检查这一点:我不知道Postgres支持这样的位置列引用,也想不出任何好的理由来使用它们,但除此之外,这是正确的。@IMSoP:这只是我在语法上的方便。一个好的用例应该是
SELECT
列表中的复杂表达式,或者使用动态SQL。如果
actor
INT
,则可能需要
actor::TEXT
。至少,我在Postgres 9.5中尝试
string\u agg
INT
s时遇到了一个错误-但除此之外,这正是我所需要的,谢谢@克里斯:可能是你的客户端设置有问题,与查询无关。考虑:值得注意的是,可选的
orderby
子句可以在分隔符参数之后进入
string\u agg
函数,例如
string\u agg(actor,,'orderby actor DESC)
Distinct非常有用,再加上一个
SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;