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;