17 窗口函数

窗口函数,也叫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 班级表;

 

上一篇:每日一题-3(分数排名)


下一篇:Ceph MDS States状态详解