如何连接 “ group by” 结果集的行? 有点像行列转换,但又不完全是,描述颇为费劲,举例如下:
假如一张表有以下数据:
中国 台北
中国 香港
中国 上海
日本 东京
日本 大阪
要求得到如下结果集:
中国 台北,香港,上海
日本 东京,大阪
此文介绍几种实现以上要求的方法: PostgreSQL 版本为 9.0
创建初始表并插入数据
1 |
skytf=> create table city (country character varying(64),city character varying(64)); |
方法一: 使用聚集函数 array_agg
1.1 函数说明
Function name array_agg
Argument Type(s) any
Return Type array of the argument type
Description input values, including nulls, concatenated into an array
1.2 测试函数
1 |
skytf=> /df array_agg |
备注: 这正是我们需要的结果,返回的结果类型为数组。
方法二: 使用聚集函数 string_agg
2.1函数说明
Function name string_agg(expression, delimiter)
Argument Type(s) text, text
Return Type text
Description input values concatenated into a string, separated by delimiter
2.2 测试函数
1 |
skytf=> select country,string_agg(city,',') from city group by country; |
备注;string_agg 函数返回结果为 text 类型。
方法三: 自定义聚集函数
3.1 创建聚集函数
1 |
skytf=> CREATE AGGREGATE array_accum(anyelement) ( |
3.2 测试函数
1 |
skytf=> select country,array_accum(city) from city where country='中国' group by country; |
备注:同样得到了预期的结果,返回的类型为数组。
参考
- http://www.postgresql.org/docs/9.0/static/functions-aggregate.html
- http://www.postgresql.org/docs/9.0/static/sql-createaggregate.html
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/tech/database/237903.html