注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL: 如何连接 " group by " 结果集的行?  

2012-10-24 13:32:34|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

        如何连接 " group by" 结果集的行? 有点像行列转换,但又不完全是,
描述颇为费劲,举例如下:
   
假如一张表有以下数据:   
中国                 台北
中国                 香港
中国                 上海
日本                 东京
日本                 大阪

要求得到如下结果集:
中国    台北,香港,上海
日本    东京,大阪

      此文介绍几种实现以上要求的方法: PostgreSQL 版本为 9.0
    
--创建初始表并插入数据

 skytf=> create table city (country character varying(64),city character varying(64));
CREATE TABLE

skytf=> insert into city values ('中国','台北');
INSERT 0 1
skytf=> insert into city values ('中国','香港');
INSERT 0 1
skytf=> insert into city values ('中国','上海');
INSERT 0 1
skytf=> insert into city values ('日本','东京');
INSERT 0 1
skytf=> insert into city values ('日本','大阪');
INSERT 0 1

skytf=> select * From city;
 country | city
---------+------
 中国    | 台北
 中国    | 香港
 中国    | 上海
 日本    | 东京
 日本    | 大阪
(5 rows)

   


一 方法一:使用聚集函数 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 测试函数

 skytf=> \df array_agg
                           List of functions
   Schema   |   Name    | Result data type | Argument data types | Type
------------+-----------+------------------+---------------------+------
 pg_catalog | array_agg | anyarray         | anyelement          | agg
(1 row)

skytf=> select country,array_agg(city) from city group by country;
 country |    array_agg    
---------+------------------
 中国    | {台北,香港,上海}
 日本    | {东京,大阪}
(2 rows)    

     备注: 这正是我们需要的结果,返回的结果类型为数组。
         
二 方法二:使用聚集函数 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 测试函数

 skytf=> select country,string_agg(city,',') from city group by country;
 country |   string_agg  
---------+----------------
 中国    | 台北,香港,上海
 日本    | 东京,大阪
(2 rows)

skytf=> select country,string_agg(city,',') from city where country='中国' group by country;
 country |   string_agg  
---------+----------------
 中国    | 台北,香港,上海
(1 row)

       备注;string_agg 函数返回结果为 text 类型。
    

三 方法三:自定义聚集函数
--3.1 创建聚集函数
skytf=> CREATE AGGREGATE array_accum(anyelement) (
skytf(>     SFUNC = array_append,
skytf(>     STYPE = anyarray,
skytf(>     INITCOND = '{}'
skytf(> );
CREATE AGGREGATE


--3.2 测试函数
skytf=> select country,array_accum(city) from city where country='中国' group by country;
 country |   array_accum   
---------+------------------
 中国    | {台北,香港,上海}
(1 row)

 备注:同样得到了预期的结果,返回的类型为数组。
 
 
四 参考
http://www.postgresql.org/docs/9.0/static/functions-aggregate.html
http://www.postgresql.org/docs/9.0/static/sql-createaggregate.html

  评论这张
 
阅读(18999)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016