第八章 SQL高级处理 8-1 窗口函数
一、什么是窗口函数
窗口函数也称为LOAP函数。OnLine Analytical Processing的简称。意思是对数据库数据进行实时分析处理。
窗口函数就是为实现OLAP而添加的标准SQL功能。
注:截止2016年5月,Oracle/SQL Server/DB2/PostgreSQL的最新版本都已经支持该功能,但目前MySQL5.7还不支持窗口函数。
二、窗口函数的语法
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023161649657-567564222.png)
1、能够作为窗口函数使用的函数
(1)能够作为窗口函数的聚合函数(SUM/AVG/COUNT/MAX/MIN)
(2)RANK/DENSE_RANK/ROW_NUMBER等专用窗口函数。
二、语法的基本使用方法——使用RANK函数
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023161817156-34571354.png)
PARTITION BY能够设定排序的对象范围。
ORDER BY能够指定按照哪一列,何种顺序进行排序。
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023161944963-1221243745.png)
RANK函数并不会减少原表找那个记录的行数。
三、无需指定PARTITION BY
四、专用窗口函数的种类
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023162049748-1768768390.png)
注:由于专用窗口函数无需参数,因此通常括号中都是空的。
五、窗口函数的使用范围
原则上窗口函数只能在SELECT子句中使用。
六、作为窗口函数使用的聚合函数
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023162220131-120778803.png)
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023162246699-189634150.png)
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023162331498-99350716.png)
像这样以“自身记录(当前记录)”作为基准进行统计,就是将聚合函数当做窗口函数使用的最大特征。
七、计算移动平均
窗口函数就是将表以窗口为单位进行分割,并在其中进行排序的函数。其实其中还包含在窗口中指定更加详细的汇总范围的备选功能,该备选功能中的汇总范围称为框架。
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023162451445-2123602356.png)
1、指定框架(汇总范围)
由于框架是根据当前记录来确定的,因此和固定的窗口不同,其范围会随着当前记录的变化而变化。
ROW PRECEDING 截止到之前~行
ROW FOLLOWING 截止到之后~行
2、将当前记录的前后行作为汇总对象
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023162624156-1007638800.png)
八、两个ORDER BY
OVER子句中的ORDER BY只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序并没有影响。
![](https://img2018.cnblogs.com/blog/1459257/201810/1459257-20181023162724190-564456915.png)
注:使用汇总函数作为窗口函数使用时,会以当前记录为基准来决定汇总对象的记录。