8-1 窗口函数
■作为窗口函数使用的聚合函数
■计算移动平均
■两个 ORDER BY
● 窗口函数可以进行排序, 生成序列号等一般的聚合函数无法实现的高操作.
● 理解 PARTITION BY 和 ORDER BY 这两个关键字的含义十分重要.
■什么是窗口函数
在 Oracle 和 SQL Server 中称为分析函数. 但是 MySQL 的 5.7 版本还是不支持窗口函数.
OLAP 是 OnLine Analytical Processing 的简称, 意思是对数据库数据进行实时分析处理. 例如, 市场分析, 创建财务报表, 创建计划等日常性商务工作.
窗口函数就是为了实现
OLAP 而添加的标准 SQL 功能.
■窗口函数的语法
窗口函数大体可以分为以下两种.
1 能够作为窗口函数的聚合函数( SUM, AVG, COUNT, MAX, MIN)
2 RANK, DENSE_RANK, ROW_NUMBER 等专用窗口函数
■语法的基本使用方法 -- 使用 RANK 函数
正如其名称所示, RANK 是用来计算记录排序的函数.
例如, 对于之前使用过的 Product 表中的 8 件商品, 让我们根据不同的商品种类 (product_type), 按照销售单价(sale_price) 从低到高的顺序排序, 结果如下所示.
PARTITION BY 能够设定排序的对象范围.
ORDER BY 能够指定按照哪一列, 何种顺序进行排序. 可以通过关键字
ASC/DESC 来指定升序和降序. 省略该关键字时会默认按照 ASC, 也就是
升序进行排序.
■无需指定 PARTITION BY
使用窗口函数时起到关键作用的是 PARTITION BY 和 GROUP BY.
其中, PARTITION BY 并不是必需的, 也就是将整个表作为一个大的窗口来使用.
■专用窗口函数的种类
● RANK 函数
计算排序时, 如果存在相同位次的记录, 则会跳过之后的位次.
例)有 3 条记录排在第 1 位时: 1 位, 1 位, 1 位, 4 位......
● DENSE_RANK 函数
同样是计算排序, 即使存在相同位次的记录, 也不会跳过之后的位次.
例)有 3 条记录排在第 1 位时: 1 位, 1 位, 1 位, 2 位......
● ROW_NUMBER 函数
赋予唯一的连续位次.
例)有 3 条记录排在第 1 位时: 1 位, 2 位, 3 位, 4 位......
除此之外, 各 DBMS 还提供了各自特有的窗口函数. 上述 3 个函数 (对于支持窗口函数的 DBMS 来说) 在所有的 DBMS 中都能够使用.
■窗口函数的适用范围
窗口函数只能书写在一个特定的位置, 这个位置就是 SELECT 子句之中.
反过来说, 就是这类函数不能在 WHERE 子句或者 GROUP BY 子句中使用.
之所以在 ORDER BY 子句中能够使用窗口函数, 是因为 ORDER BY 子句会在 SELECT 子句之后执行, 并且记录保证不会减少.
来源: http://www.bubuko.com/infodetail-3395821.html