当前位置:网站首页 > Haskell函数式编程 > 正文

MySQL窗口函数(MySQL窗口函数)



  之前我给粉丝们搞过个投票,寻找MySQL中那个~~MySQL中哪些技术点是你既熟悉又陌生的?

前三名和我预料大差不差,分别是:

1、游标2、窗口函数3、聚簇索引

  这三个点虽然平时用得少,但在。值得一提的是,很多面试官对问题竟然也是一知半解。。

在这里插入图片描述

  好了,废话不多说,老规矩,先上开胃小菜,看看今天的测试表数据吧。

  本文用来演示用的测试表是,翻译过来就是emmm…陈哈哈的包子铺。悄悄告诉你,哈哥今年盘了个包子铺卖包子,这张表就是包子铺这半年的利润~

  怎么说?什么时候来我店里,请大家吃面馅儿包子。

  其实的概念是非常重要的,要想学会窗口函数,可不能只知其一不知其二;我们得搞清楚代表着啥,才知道什么时候该用它。

  拿测试表举个简单的例子,统计一下:。

  从这条SQL可以看出,对于第一行id=6这行的就是第一行,对于第二行id=5这行的就是前两行,以此类推(如下图)。

在这里插入图片描述

  可见,,可以理解为一些记录(行)的集合;窗口函数也就是在的特殊函数。

  对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于;有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫。看完本文再回来看这句话相信会理解的更透彻[手动狗头]。

窗口函数也叫(Online Anallytical Processing),可以对数据进行实时分析处理。

窗口函数多用在什么场景?主要有以下两类:

  • 排名问题,例如:查包子铺利润月排名;
  • TOPN问题,例如:查每种包子利润最高的两个月;

我们常见的窗口函数和聚合函数有这些:

  • 专用窗口函数:,,
  • 聚合函数:,,,,

因为聚合函数也可以放在窗口函数中使用,因此窗口函数和普通聚合函数也很容易被混淆,二者区别如下:

  • 是将;而窗口函数是。
  • 聚合函数也可以用于窗口函数中,这个我会举例说明。

基本语法:

注意:窗口函数是对where或者group by子句处理后的结果再进行二次操作,因此会按照SQL语句的运行顺序,窗口函数一般放在select子句中(from前),例如上一条SQL,可以往上拖着看看~

窗口函数都有哪些?懒得画了,借老哥的导图一用~~

在这里插入图片描述

  • 序号函数:row_number() / rank() / dense_rank()
  • 分布函数:percent_rank() / cume_dist()
  • 前后函数:lag() / lead()
  • 头尾函数:first_val() / last_val()
  • 其他函数:nth_value() / nfile()

让我们来分别举例看一看:

ROW_NUMBER():顺序排序 —— 1、2、3

RANK():并列排序,跳过重复序号 —— 1、1、3

DENSE_RANK():并列排序,不跳过重复序号 —— 1、1、2

如上述示例可见,三个窗口函数服务与不同的三个典型业务需求,这三种足以应对我们的排序统计。

以后同学们在面试或笔试时被问到时,请不要再说自查询嵌套之类的lowB方案了,不然可别说你认识我~狗子们

这个分布函数基本不用,不讲。有兴趣的同学自行百度~

expr后面还会涉及到,统一解释一下:expr可以是,也可以是

前后函数常用于:返回位于当前行的的expr的值

应用场景:查询前n名同学的成绩和当前同学成绩的差值

内层SQL先通过LAG()函数得到前1名同学的成绩,外层SQL再将当前同学和前1名同学的成绩做差得到成绩差值diff。

这里换成哈哥的测试表就有点尬了。。但你肯定明白这意思,来,让我们尬查一下:

这里我想问一下同学们是不是发现这条SQL和前面SQL不同?有哪几个地方不同呢?

1、

其实,这种是把窗口提了出来,,像我们写SQL时用别名一样,这样看起来会简洁舒服一些,是吧。

有人问程序员要什么简洁?别人看不懂才会觉得代码牛B啊。这种同学一看就是没被社会毒打过,等你遇到百年一见的祖传代码时候,你就懂啥叫大道至简了(借胖哥图一用)。

在这里插入图片描述

2、窗口中增加了

  这个关键字在over子句中,也就意味着控制了窗口的内容,在上面基础语法中我告诉你over中有两个个关键词:

  • 是对窗口内容进行分组处理;
  • 是对窗口内容分组后进行排序;

  其实,还有更有意思的控制窗口范围的方式~~

  对于,有两种方式,基于行和基于范围,我跟你着重介绍常用的来控制窗口范围;

  通常使用BETWEEN frame_start AND frame_end语法来表示行范围,frame_start和frame_end可以支持如下关键字,来确定不同的动态行记录:

  • CURRENT ROW 边界是当前行,一般和其他范围关键字一起使用
  • UNBOUNDED PRECEDING 边界是分区中的第一行
  • UNBOUNDED FOLLOWING 边界是分区中的最后一行
  • expr PRECEDING 边界是当前行减去expr的值
  • expr FOLLOWING 边界是当前行加上expr的值

来看几个例子:

计算当前行与前n行(共n+1行)的聚合窗口函数

下例中控制窗口大小为当前月+前两个月的利润总和,来看一下效果:

②计算当前行与前n1行、后n2行的聚合窗口函数

下例中控制窗口大小为当前月前一个月到后一个月的利润总和,来看一下效果:

头尾函数应用于:返回第一个或最后一个expr的值;

应用场景:截止到当前,按照日期排序查询和。

nfile()不常用,不再赘述;这里我们只提一下函数;

NTH_VALUE用途:返回窗口中第n个expr的值。

应用场景:截止到当前,显示陈哈哈包子铺月利润榜中排名第2和第3的成绩的利润。

  窗口函数就说到这里,窗口函数是我接触MySQL8以后发现的新东西,突然感觉MySQL开发团队还是很灵性的,每个版本都会新增一些玩儿法,当然也很实用,希望MySQL9.0会给我们带来更多的惊喜。

到此这篇关于MySQL窗口函数的具体使用的文章就介绍到这了,更多相关MySQL窗口函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

到此这篇MySQL窗口函数(MySQL窗口函数)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 反激占空比计算公式(反激占空比取多少合适)2026-02-11 10:18:06
  • 支付方式怎么改成指纹(支付方式怎么改成指纹解锁)2026-02-11 10:18:06
  • 十大常见密码加密方式(十大常见密码加密方式数字)2026-02-11 10:18:06
  • ip报文格式的题目(ip报文格式的题目有哪些)2026-02-11 10:18:06
  • pcap文件格式(pcapng文件格式)2026-02-11 10:18:06
  • pivot_table函数(pivot_table函数可对列进行操作)2026-02-11 10:18:06
  • yml文件不提示(yml文件格式要求)2026-02-11 10:18:06
  • 合并数组的函数(合并数组并排序)2026-02-11 10:18:06
  • redis 哨兵模式配置(redis哨兵模式搭建)2026-02-11 10:18:06
  • 工资支付方式有哪些(工资支付方式有哪些种)2026-02-11 10:18:06
  • 全屏图片