窗口函数,也叫OLAP(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
语法:
<窗口函数> over (partition by <用于分组的列名> order by <用于分组的列名>) <窗口函数>的位置,可以放以下两种函数: 1. 聚合窗口函数:如sum、avg、count、max、min等; 2. 非聚合窗口函数(或称专用窗口函数):如rank、dense_rank、row_number等。
对于专用窗口函数,解释如下:
VALUES | RANK | DENSE_RANK | ROW_NUMBER |
70 | 1 | 1 | 1 |
70 | 1 | 1 | 2 |
70 | 1 | 1 | 3 |
75 | 4 | 2 | 4 |
80 | 5 | 3 | 5 |
90 | 6 | 4 | 6 |
rank函数是并列跳跃排名,并列即相同的值,相同的值保留重复名次,遇到下一个不同的值,跳跃到总共的排名;
dense_rank函数是并列连续排名,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,按照连续数字的排名;
row_number函数是连续排名,即使相同的值,依旧按照连续数字排名。
使用:
1. 专用窗口函数rank
--在每个班级内按照成绩排名 select *,rank() over(partition by 班级 order by 成绩 desc) as 排名 from 成绩表;
group by分组汇总后改变了表的行数,一行只有一个类别。而partition和rank函数不会减少原表中的行数。
partition子句可以省略,省略就是不指定分组,只是按成绩由高到低进行排序。
2. 其他专用窗口函数
如上面所示的,对rank、dense_rank、row_number函数的解释。
3. 聚合函数作为窗口函数
聚合窗口函数和上面提到的专用窗口函数用法完全相同,只需要把聚合函数写在窗口函数的位置即可,但是函数后面里面不能为空,需要制定聚合的列名。
select *, sum(成绩) over (order by 学号) as current_sum, avg(成绩) over (order by 学号) as current_avg, count(成绩) over (order by 学号) as current_count, max(成绩) over (order by 学号) as current_max, min(成绩) over (order by 学号) as current_min from 班级表;