将一列中的多个结果行连接成一列,按另一列分组
我有这样的桌子
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;
GROUP BY 1
是这种情况下的位置引用和GROUP BY movie
的快捷方式。
string_agg()
需要数据typestext
作为input。 其他types需要显式转换( actor::text
) – 除非定义了隐式转换为text
– 对于所有其他字符types( varchar
, character
, "char"
)和其他types,情况如此。
你可以使用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 |
看到这个SQLFiddle
更多请参见9.18。 聚合函数
select movie,GROUP_CONCAT(DISTINCT Actor) as ActorList from toyr_table group by movie