参考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最小值,都是针对自身记录、以及自身记录之上的所有数据进行计算;
聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响。

图片说明

注意

聚合函数与专业窗口函数在用作窗口函数时其区别在于聚合函数括号内必须指定聚合的列名,而专业窗口函数不需要,它是在order by里指定;

窗口函数原则上只能写在select子句中;