窗口函数
2020-09-17 17:30:09 108 举报
AI智能生成
SQL窗口函数
作者其他创作
大纲/内容
窗口函数有什么用?
在每组内排名
什么是窗口函数?
定义:窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理
功能
在分组(partition by)的基础上排序(order by)
不减少原表的行数
基本语法:‹窗口函数› over (partition by ‹用于分组的列名› order by ‹用于排序的列名›)
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行)的平均
在公司业绩名单排名中,可以通过移动平均,直观地查看到与相邻名次业绩的平均、求和等统计数据
面试经典案例
排名问题
在每组内排名
如每个部门按业绩来排名
topN问题
分组取每组最大值、最小值,每组最大的N条(top N)记录
累计求和问题
用聚合函数作为窗口函数,有累计的功能
如何在每个组里比较
如查找每个组里大于平均值的数据
因为窗口函数在select子句中,所以注意sql语句执行顺序,可以把查询出的结果作为一个表,再在此基础上进行条件查询
方法1,使用窗口函数
方法2,使用关联子查询
注意
1.窗口函数原则上只能写在select子句中
因为窗口函数是对where或者group by子句处理后的结果进行操作,所以要特别注意运行顺序
2.partition子句可以省略,省略就是不指定分组,只是按照排序关键字排序
3.group by可以分组为什么还用窗口函数
因为group by分组汇总后改变了表的行数,一行只有一个类别。而partiition by和rank函数不会减少原表中的行数
4.rank, dense_rank, row_numbe这三个窗口函数后面的括号不需要任何参数,保持()空着就可以
0 条评论
下一页