postgresql 将一列的多个结果行连接为一行,按另一列分组[重复]

yftpprvb  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(150)
    • 此问题在此处已有答案**:

How to concatenate strings of a string field in a PostgreSQL 'group by' query?(14个答案)
九年前就关门了。
我有一张这样的table
| 电影|演员|
| - ------|- ------|
| A类|1个|
| A类|第二章|
| A类|三个|
| 乙|四个|
我想得到一部电影的名字和电影中的所有演员,我想得到的结果是这样的格式:
| 电影|演员列表|
| - ------|- ------|
| A类|一、二、三|
我该怎么做呢?

1u4esq0p

1u4esq0p1#

使用聚合函数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;

但在子查询中对行进行排序通常更快。请参阅:

  • 在SELECT中创建数组
jdzmm42g

jdzmm42g2#

您可以使用array_agg函数:

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

结果:
| 电影|演员|
| - ------|- ------|
| A类|一、二、三|
| 乙|四个|
查看此SQLFiddle
更多信息请参见9.18. Aggregate Functions

相关问题