PostgreSQL 支持 Window Functions,可以对查询出的结果集进行分组处理,非常方便,接下来举个简单的例子演示下。
创建测试表
创建一张成绩表,取各科目成绩最高的同学。
1 |
francs=> create table score ( id serial primary key,subject varchar(32),stu_name varchar(64),score numeric(3,0) ); |
插入测试数据
1 |
francs=> insert into score ( subject,stu_name,score ) values ('Chinese','francs',70); |
方法一: 使用窗口函数
1 |
select * |
备注:这里使用了 windows function ,其中 “over(partition by subject order by score desc )”是 windows function 核心,”partition by ..”表示将结果集根据指定字段进行分组,上例中是将结果集根据 subject 进行分组; “order by ..” 是指将每组的结果集根据指定字段排序。
方法二: 使用嵌套查询
1 |
select a.* |
备注:暂且不考虑语句效率,仅实现功能。
在结果集中增加各科目平均成绩信息
1 |
francs=> select subject,stu_name,score,avg(score) over (partition by subject) from score; |
Row_number() 窗口函数
1 |
francs=> select subject,stu_name,score,row_number() over (partition by subject) from score; |
备注:使用 row_number() over … 函数可以对结果集按某字段分组后的记录进行标记,因此使用 row_number() 窗口函数很容易实现取分组后指定记录的功能。
Rank() over 窗口函数
1 |
francs=> select subject,stu_name,score,rank() over (partition by subject order by score desc) from score; |
备注: rank() 窗口函数和 ow_number() 窗口函数类似,但 rank() 窗口函数会将结果集分组后相同值的记录的标记相等,例如上例中红色的记录。
取行号
取结果集行号,相当于Oracle 里的 rownum
1 |
francs=> select row_number() OVER (ORDER BY id) AS rownum ,* from score; |
参考
- http://www.postgresql.org/docs/9.2/static/tutorial-window.html
- http://www.postgresql.org/docs/9.2/static/functions-window.html
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/237884.html