SQL窗口函数
参考https://zhuanlan.zhihu.com/p/92654574
窗口函数有什么用?
例如,对公司内各个部门内的员工,按业绩排名,又或者找出每个部门排名前N的员工进行奖励。
这种情况不是把公司里所有员工放在一起排名,而是把不同部门的员工分开排名,就需要用到窗口函数。
窗口函数是什么?
可以用于对数据集进行实时分析处理
语法如下:
<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)
<窗口函数>的位置,可以放以下两种函数:
1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。
2) 聚合函数,如sum. avg, count, max, min等
举个例子
select *, rank() over (partition by 班级 order by 成绩 desc) as ranking from 班级表
partition by是对表分组
order by是对分组后的结果按某个指标排序
为什么不用group by?
group by函数和聚合函数一起使用时会改变表的行数,聚合出的一类只对应一行;而partition by则不会:
专业窗口函数rank, dense_rank, row_number
区别在于在排序的时候是否考虑并列的情况,是自增1还是遇到并列取相同值;以及对于并列的情况是否占用后续的名次;
聚合函数
sum求和,avg平均、count计数、max最大min最小值,都是针对自身记录、以及自身记录之上的所有数据进行计算;
聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。