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 函数

 SQL-一文get窗口函数_第1张图片 

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

 SQL-一文get窗口函数_第2张图片 

专用窗口函数的种类

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;

 SQL-一文get窗口函数_第3张图片   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 只是用来决定窗口函数按照什么样的顺序进行计算的,对结果的排列顺序并没有影响将聚合函数作为窗口函数使用时,会以当前记录为基准来决定汇总对象的记录。

你可能感兴趣的:(SQL,sql,数据库,database)