MySQL窗口函数

news2024/11/30 20:45:07

窗口函数在统计类的需求中很常见,稍微复杂一点的查询需求就有可能用到它,使用窗口函数可以极大的简化我们的 SQL 语句。像 Oracle、SQL Server 这些数据库在较早的版本就支持窗口函数了,MySQL 直到 8.0 版本后才支持它。
一般来说涉及复杂的分组内问题如: 分组排名(取TOPn),分阶段统计(分阶段最大最小平均等)都可以用到窗口函数

窗口函数需要注意以下两点:

  • 窗口分为“静态窗口”和“滑动窗口”,窗口滑动的范围会影响窗口函数的值,这个范围可以根据业务需求自己设置
  • 使用了窗口函数over(partition by id)时,出来的结果会按这个id字段排在一起(最终是否聚合要看外层有没有group by id)

  • 窗口函数分为“聚合”与“非聚合”

1.先看看大概长什么样子,over()是什么含义

可以看到over()里面可以进行partition分区(就是分组的效果)、order by可以排序、后面有个RANGE字段放在第三点讲,这个RANGE或者ROW会影响over的作用效果

select distinct user_id,
   first_value(knowledge_name)
      over (partition by user_id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as last,
   last_value(knowledge_name)
      over (partition by user_id order by score RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)  as best
from tb_math_knowledge_point

同样的我们还可以对常见的SUM()函数接一个over()

SELECT 
	*,
	SUM(quantity) OVER (PARTITION BY product ORDER BY quantity ROWS CURRENT ROW) AS sum1,
	SUM(quantity) OVER (PARTITION BY product ORDER BY quantity RANGE CURRENT ROW) AS sum2,
	SUM(quantity) OVER (PARTITION BY product RANGE CURRENT ROW) AS sum3

由此应该可以感觉到,这个over()就是所谓的窗口,我们可以在over()中控制滑动窗口的范围,从而取到不同的值

2.以sum() over()来举例

窗口函数的over()中有三个参数:分别是

  • partition by
  • order by
  • frame 滑动窗口的范围

在这一点的demo中会详细解释,本demo参考了https://blog.csdn.net/georgelee954/article/details/105763302?spm=1001.2014.3001.5506

2.1 水果订单表

2.2默认的frame,即默认滑动窗口

在over()中,frame也是有默认值(默认范围)的
根据是否有partition by、order by决定不同的默认值

2.2.1 没有partition也没有order

窗口范围是:所有行,这里即是sum对所有行进行求和

SELECT 
	*,
	SUM(quantity) OVER () AS sum1
FROM sql_store.product_order;

2.2.2只有order 没有partition

窗口范围:第一个分区 到 所在行的分区,这里一般都不会这样单独用,深究意义不大

2.2.3 有partition 无论有没有order

窗口范围:该行的整个分区,注意与上面的区别,如果用partition限定了分区,则扫描到哪一行,就取那行对应的整个分区

2.3上面demo没有指定frame参数

上面的这个demo只在over()中指定了partition和order,因此无法自由控制滑动窗口的范围

3.指定frame滑窗范围

这个fream参数其实叫框架,我这里为了方便理解直接写为了滑窗

3.1滑窗筛选单位

滑窗的筛选单位分为两种:{ROWS | RANGE},默认值为RANGE
所谓筛选单位,就是:被视为同一个单位的几个行数据,一起进入窗口函数,并共享最终的唯一结果

我们关于如下脚本,有3种不同的情况:

3.1.1 ROWS:筛选一行

SUM(quantity) OVER (PARTITION BY product ORDER BY quantity ROWS CURRENT ROW) AS sum1
sum1中,使用ROWS作为基本单位,所以对每一行进行单独计算,sum(current row)统计值就是quantity本身

3.1.2 RANGE(有排序):筛选上下连续相同的x对应的值

sum2中,使用RANGE作为基本单位apple 的第二、第三个订单数量都为10,所以第二、第三行视为一个单位

3.1.3 RANGE(无排序):筛选当前行所在的分区所有行

sum3中,使用RANGE作为基本单位并且没有ORDER BY所以每个分区为一个单位

3.2自定义灵活的滑窗范围

个人认为跟上面的3.1滑窗筛选单位ROWSRANGE属于一个包含关系,单位可以选择ROWS行、RANGE范围,都可以筛选一定的范围内,但比较死板,不够灵活,3.2就是这个升级版,足够灵活

  • CURRENT ROW :当前行
  • UNBOUNDED PRECEDING :当前行上侧所有行
  • UNBOUNDED FOLLOWING :当前行下侧所有行
  • expr PRECEDING:当前行上侧expr行(expr可以是数字,也可以是表达式)
  • expr FOLLOWING:当前行下侧expr行(expr可以是数字,也可以是表达式)

我们可以自由的进行组合,来达到自定义分组(分区)内滑窗范围的效果
因此我们可以通过这种方式统计:

  • 总是关注n几个记录(n日活跃汇总、n场直播观场汇总)
  • 按A分组,满足B时C的值(每个部门 A 工资 B 排名前n的员工 C 名字)
  • 行在每组的占比(每个员工占自己部门总工资的百分之多少)

滑窗范围有:frame_start 和 frame_between

一般来说用后者,前者是只指定滑窗起点,终点是默认值
后者是起点终点都指定,最为灵活,也最为实用

3.2.1只指定滑窗起点frame_start

仅指定开始行(或区域),则结束范围为默认值,即当前行(或区域)

3.3.2自由度最高的frame_between

SELECT 
	*,
	SUM(quantity) OVER
	 (PARTITION BY product 
	 ORDER BY quantity
	 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sum
FROM sql_store.product_order

  • 因为指定了group by,所以按分组求和
  • 因为指定了order by,所以有连续值被划为一个单位的可能,所以需要再用frame限定滑窗范围
  • 语句设置了frame_start(UNBOUNDED PRECEDING)和frame_end(CUREENT ROW),即框架范围为第一行至当前行,实现了累计求和的效果。

4.实际案例


如果要换成5.7版本的,不用窗口函数,那写起来就很庞大了

5.其他

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch深度学习实战lesson29

第二十九课 深度学习硬件 这节课讲一下深度学习的硬件。具体来讲一下所谓的 CPU 和 GPU有什么区别,为什么 GPU 会快? 目录 CPU GPU 首先大家如果学习深度学习的话基本上都有一个GPU的电脑,如果你自己装一台机器的话,很有可能是…

【JavaScript高级】04-JavaScript函数增强

JavaScript函数增强函数属性和arguments函数对象的属性函数中的argumentsarguments转Array函数的剩余参数纯函数的理解和应用JavaScript纯函数定义纯函数案例柯里化的理解和应用柯里化定义组合函数理解和应用函数属性和arguments 函数对象的属性 在JavaScript中函数也是一个对…

维格云自定义按钮入门教程

目录 维格云自定义按钮功能简介 维格云自定义按钮适用场景 维格云自定义按钮设置步骤 开启插件 在拓展设置中创建按钮 在数据表中添加自定义按钮 效果展示 维格云自定义按钮注意事项 维格云自定义按钮功能简介 给不同情境下的数据详情页面,添加按钮,点击后可往另一个…

【博弈论】极小极大搜索(Minimax Algorithm)与α-β剪枝(Alpha-Beta Pruning)

文章目录一、极大极小搜索(Minimax Algorithm)二、α-β剪枝(Alpha-Beta Pruning)三、解题技巧一、极大极小搜索(Minimax Algorithm) 在零和博弈(有完整信息的,确定的、轮流行动的&…

steam搬砖项目月入过万靠谱吗

大家好,我是阿阳 什么是国外steam游戏装备汇率差项目 一、项目介绍 其实,Steam就是一个美国的游戏平台,搬砖主要是搬的一款火遍全球的游戏CSGO的装备和饰品。CS听说过吧,这款游戏就是CS的一个系列。(通俗易懂的理解就…

【C++数据结构】性能测量

性能测量 4.1 引言 容易计算内存的需求大小,只要知道编译后的代码和数据空间的大小就可以了; 数据空间的大小取决于用户所要解决的问题实例的大小。 要确定程序运行时间,需要通过实验来测量。 程序性能不仅依赖操作类型和数量&#xff0c…

Excel逆向查询的多种方法,赶快学起来

关于匹配查询,我们平时用的做多的就是VLOOKUP函数了,但VLOOKUP函数只能正向查找,不能逆向查询。 像是下面这种情况就不可以: (现在我们想用编码去匹配书名) 如果在不改变原表格结构的基础上查找出书目编码…

当MySQL和java通过媒婆navicate谈上了恋爱 ------ MySQL的安装和Java的连接

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐当MySQL和java通过媒婆navicate谈上了恋爱⭐ 文章目录⭐当MySQL和java通过媒婆navicate谈上了恋爱…

vue组件库发布到npm

修改项目的信息 在package.json文件中: 修改Readme文件的信息 注册npm 账号 指路官网 vscode终端登录npm 执行 npm login 输入用户名,密码,邮箱,邮箱验证码 如下图 执行 npm publish 如下图 出现的问题 npm ERR! code E403 …

CSAPP Lab6:Malloc

文章目录一、实验简介二、隐式链表实现基本宏块的相关函数mm_initmm_mallocmm_freemm_reallocextend_heapblk_mergeblk_findblk_split使用下次匹配三、显式链表实现四、分离适配五、完整代码隐式链表显式链表课本实现一、实验简介 实现一个动态内存分配器。 tar xvf mallocla…

Linux 应急响应命令总结,收藏版

系统排查 系统基本信息 CPU 信息 CPU 信息:lscpu 操作系统信息 操作系统信息:uname -a 操作系统信息:cat /proc/version 模块信息 模块信息:lsmod 账户信息 系统所有账户 系统所有账户:cat /etc/passwd 超级权限账户 超…

3D-SKIPDENSESEG医学图像分割

蓝色三角、黄色三角、红色三角相对应。 得到第三个feature map,反卷积会恢复到原来的尺寸 Dense block,通道增加了 Transition,池化 用正则表达式把里面的h5文件匹配一下吧 os.path.join()把两个部分的路径拼一下 root_path —data_train *.…

[kubernetes]-k8s开启swap

导语:记录k8s开启swap后先后做的调整 测试版本 k8s1.20版本 使用参数--fail-swap-onfalse Environment"KUBELET_EXTRA_ARGS--fail-swap-onfalse"使用测试 可以开启swap不报错 但是pod使用swap不太理想。且无法实现在使用swap的时候限制pod的内存。会造…

【Java面试】List接口

文章目录Iterator 和 ListIterator 有什么区别?遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java中List 遍历的最佳实践是什么?说一下 ArrayList 的优缺点如何实现数组和 List 之间的转换?ArrayList 和 …

M4 tm4c1294单片机软件调式总结

1,框架图: 调式基本方法: (1)加串口打印初始化,单步跟踪查看,类似gdb的单步; (2)打印命令行,重点参数添加命令行打印; (3&#xff…

Redis 的相关基础知识

【一】 Redis 中默认的端口号为什么是6379 图中的人名为 Alessia Merz ,其中的 Merz 对应的九键输入法按出来的就是6379 【二】 Redis 默认的数据库 Redis 中默认使用的是16个数据库,类似数组下标从0开始,初始默认使用0号数据库 【三】 Redis…

vscode搭建Verilog HDL开发环境

工欲善其事,必先利其器。应该没有多少人会使用Quartus和vivado这些软件自带的编辑器吧,原因在于这些编辑器效率很低,Verilog HDL代码格式比较固定,通常可以利用代码片段补全加快书写。基本上代码写完之后才会打开Quartus或者vivad…

一文带你了解Spring中的事务管理

文章目录前言一、事务的基础概念二、spring中事务的使用声明式事务编程式事务如何选择事务方式三、spring中事务管理实现原理前言 本文将涉及以下知识点: 事务的基础概念spring当中事务的使用spring当中事务管理的实现原理 一、事务的基础概念 事务(T…

python画图

python画图1.使用matplotlib画图2.使用pyecharts画图2.x pyecharts的三种图片渲染工具2.x.1 snapshot_selenium2.x.2 snapshot_phantomjs2.x.3 snapshot_pyppeteer1.使用matplotlib画图 2.使用pyecharts画图 pyecharts是一款将python与echarts结合的强大的数据可视化工具&…

阿里云服务器安装tomcat

一、前置条件 安装tomcat需要先安装jdk,所以没有安装jdk同学,详见参考文章或者此文章 二、Linux上安装tomcat 1. 下载Apache tomcat tomcat官网下载地址 在左边,可以选择下载各种版本的tomcat。根据服务器操作系统选择下载。Linux操作系统…