SQL-一文get窗口函数

🎈写在前文

  • 💖 作者简介:大家好,我是小王🙋‍♂️
  • 📝 个人主页:你隔壁的小王🔥
  • 🎉 欢迎点赞👍+收藏⭐️+留言📝
  • 📣专栏:SQL🙋‍♂️

🙋‍♂️ 小伙伴们如果在学习过程中有不明白的地方,欢迎评论区留言提问!希望能和大家一起进步,共同成长!

目录

🎈写在前文

 窗口函数

 什么是窗口函数 

 窗口函数的语法

语法的基本使用方法——使用 RANK 函数

专用窗口函数的种类

计算移动平均

两个 ORDER BY 


 窗口函数

 什么是窗口函数 

  •  窗口函数也称为 OLAP 函数。为了让大家快速形成直观印象,才起了这样一个容易理解的名称,OLAP 是 OnLine Analytical Processing 的简称,意思是对数据库数据进行实时分析处理。

 窗口函数的语法

< 窗口函数 > OVER ([ PARTITION BY < 列清单 >]
ORDER BY < 排序用列清单 >)
① 能够作为窗口函数的聚合函数( SUM 、 AVG 、 COUNT 、 MAX 、 MIN )
② RANK 、 DENSE _ RANK 、 ROW _ NUMBER 等专用窗口函数

语法的基本使用方法——使用 RANK 函数

  

对于 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;

两个 ORDER BY 

  • 使用窗口函数时必须要在 OVER 子句中使用ORDER BY , OVER 子句中的 ORDER BY 只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序并没有影响将聚合函数作为窗口函数使用时,会以当前记录为基准来决定汇总对象的记录。
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你隔壁的小王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值