什么是窗口函数?
定义:窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理
功能
在分组(partition by)的基础上排序(order by)
不减少原表的行数
基本语法:‹窗口函数› over (partition by ‹用于分组的列名› order by ‹用于排序的列名›)<br>
partition by子句的功能是分组
order by子句的功能是对分组后的结果进行排序
asc升序默认
dese降序
如何使用窗口函数?
1.专用窗口函数
rank
如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4
dense_rank
如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2
row_number
不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4
2.聚合函数
sum. avg, count, max, min等
针对自身记录、以及自身记录之上的所有数据进行计算
聚合函数作为窗口函数,可以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等)。同时可以看出每一行数据,对整体统计数据的影响
3.窗口函数的移动平均
调整rows…preceding中间的数字,可以计算当前行与前n行(共n+1行)的平均
在公司业绩名单排名中,可以通过移动平均,直观地查看到与相邻名次业绩的平均、求和等统计数据
注意
1.窗口函数原则上只能写在select子句中
因为窗口函数是对where或者group by子句处理后的结果进行操作,所以要特别注意运行顺序
2.partition子句可以省略,省略就是不指定分组,只是按照排序关键字排序
3.group by可以分组为什么还用窗口函数
因为group by分组汇总后改变了表的行数,一行只有一个类别。而partiition by和rank函数不会减少原表中的行数
4.rank, dense_rank, row_numbe这三个窗口函数后面的括号不需要任何参数,保持()空着就可以