写在前文
- 作者简介:大家好,我是小王♂️
- 个人主页:你隔壁的小王
- 欢迎点赞+收藏⭐️+留言
- 专栏:SQL♂️
♂️ 小伙伴们如果在学习过程中有不明白的地方,欢迎评论区留言提问!希望能和大家一起进步,共同成长!
目录
写在前文
窗口函数
什么是窗口函数
窗口函数的语法
语法的基本使用方法——使用 RANK 函数
专用窗口函数的种类
计算移动平均
两个 ORDER BY
- 窗口函数也称为 OLAP 函数。为了让大家快速形成直观印象,才起了这样一个容易理解的名称,OLAP 是 OnLine Analytical Processing 的简称,意思是对数据库数据进行实时分析处理。
< 窗口函数 > OVER ([ PARTITION BY < 列清单 >]
ORDER BY < 排序用列清单 >)
① 能够作为窗口函数的聚合函数( SUM 、 AVG 、 COUNT 、 MAX 、 MIN )
② RANK 、 DENSE _ RANK 、 ROW _ NUMBER 等专用窗口函数
对于 Product 表中的 8 件商品,根据不同的商品种类( product_type ),按照销售单价( sale_price )从低到高的顺序排序
SELECT product_name, product_type, sale_price, RANK () OVER (PARTITION BY product_type ORDER BY sale_price) AS ranking FROM Product;
PARTITION BY 能够设定排序的对象范围,ORDER BY 能够指定按照哪一列、何种顺序进行排序。 PARTITION BY 在横向上对表进行分组,而 ORDER BY决定了纵向排序的规则。
使用窗口函数时起到关键作用的是 PARTITION BY 和 GROUP BY 。其中, PARTITION BY 并不是必需的,即使不指定也可以正常使用窗口函数。
SELECT product_name, product_type, sale_price,
RANK () OVER (ORDER BY sale_price) AS ranking
FROM Product;
RANK 函数
计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位……
DENSE_RANK 函数
同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位……
ROW_NUMBER 函数
赋予唯一的连续位次。
例)有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位……
ps:(专用窗口函数无需参数,因此通常括号中都是空的,原则上窗口函数只能在 SELECT 子句中使用,在 SELECT 子句之外“使用窗口函数是没有意义的”)
窗口函数就是将表以窗口为单位进行分割,并在其中进行排序的函数。其实其中还包含在窗口中指定更加详细的汇总范围的备选功能,该备选功能中的汇总范围称为框架
SELECT product_id, product_name, sale_price, AVG (sale_price) OVER (ORDER BY product_id ROWS 2 PRECEDING) AS moving_avg FROM Product;
ROWS (“行”)和 PRECEDING (“之前”)两个关键字,将框架指定为“截止到之前 ~ 行”,“ ROWS 2 PRECEDING ”就是将框架指定为“截止到之前 2 行”,也就是将作为汇总对象的记录限定为如下的“最靠近的 3 行”,即自身、之前1行、之前两行
关键字 FOLLOWING (“之后”)替换 PRECEDING ,就可以指定“截止到之后 ~ 行”作为框架了
如果希望将当前记录的前后行作为汇总对象时,需要同时使用 PRECEDING (“之前”)和 FOLLOWING (“之后”)关键字来实现。
SELECT product_id, product_name, sale_price, AVG (sale_price) OVER (ORDER BY product_id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS moving_avg FROM Product;