MySQL窗口函数:从理论到实践
目录
1. ROW_NUMBER()
2. RANK()
3. DENSE_RANK()
4. NTILE(n)
5. LAG() 和 LEAD()
6. FIRST_VALUE() 和 LAST_VALUE()
总结
MySQL中的窗口函数(Window Functions)允许用户对一个结果集的窗口(或分区)执行计算,这些窗口是由查询的每行定义的。窗口函数在SQL标准中定义,并且在MySQL 8.0及更高版本中可用。窗口函数为每行返回一个值,这个值是基于该行在其分区或整个结果集中的位置计算得出的。
窗口函数通常与OVER()子句一起使用,OVER()子句定义了窗口的范围或边界。over()里头的分组以及排序的执行晚于外头 where 、group by、 order by 的执行。
以原始sales表数据为例,介绍一些常见的MySQL窗口函数:
product_id | sale_date | amount |
1 | 2023-01-01 | 100.00 |
2 | 2023-01-02 | 150.00 |
3 | 2023-01-03 | 150.00 |
1 | 2023-01-04 | 120.00 |
2 | 2023-01-05 | 180.00 |
1. ROW_NUMBER()
- 为结果集中的每一行分配一个唯一的序号。
SELECT product_id, sale_date, amount, ROW_NUMBER() OVER (ORDER BY sale_date) AS row_num
FROM sales;
查询结果
product_id | sale_date | amount | row_num |
1 | 2023-01-01 | 100.00 | 1 |
2 | 2023-01-02 | 150.00 | 2 |
3 | 2023-01-03 | 150.00 | 3 |
1 | 2023-01-04 | 120.00 | 4 |
2 | 2023-01-05 | 180.00 | 5 |
2. RANK()
- 为结果集中的每一行分配一个唯一的排名,对于平级记录会留下空位。例如,如果有两行并列第一,则它们都会被分配排名1,下一行将被分配排名3(而不是2)。
SELECT product_id, sale_date, amount, RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;
查询结果
product_id | sale_date | amount | rank |
2 | 2023-01-05 | 180.00 | 1 |
2 | 2023-01-02 | 150.00 | 2 |
3 | 2023-01-03 | 150.00 | 2 |
1 | 2023-01-04 | 120.00 | 4 |
1 | 2023-01-01 | 100.00 | 5 |
3. DENSE_RANK()
- 类似于RANK(),但不会留下空位。
SELECT product_id, sale_date, amount, DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_rank
FROM sales;
查询结果
product_id | sale_date | amount | dense_rank |
2 | 2023-01-05 | 180.00 | 1 |
2 | 2023-01-02 | 150.00 | 2 |
3 | 2023-01-03 | 150.00 | 2 |
1 | 2023-01-04 | 120.00 | 3 |
1 | 2023-01-01 | 100.00 | 4 |
4. NTILE(n)
- 将结果集分为“n”个大致相等的部分,并为每行分配一个桶号。
SELECT product_id, sale_date, amount, NTILE(2) OVER (ORDER BY sale_date) AS quarter
FROM sales;
查询结果
product_id | sale_date | amount | quarter |
1 | 2023-01-01 | 100.00 | 1 |
2 | 2023-01-02 | 150.00 | 1 |
3 | 2023-01-03 | 150.00 | 2 |
1 | 2023-01-04 | 120.00 | 2 |
2 | 2023-01-05 | 180.00 | 2 |
5. LAG() 和 LEAD()
- 允许访问前面或后面的行而无需自连接。
SELECT
product_id,
sale_date,
amount,
LAG(amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS previous_amount
FROM sales;
查询结果
product_id | sale_date | amount | previous_amount |
1 | 2023-01-01 | 100.00 | NULL |
2 | 2023-01-02 | 150.00 | NULL |
3 | 2023-01-03 | 150.00 | NULL |
1 | 2023-01-04 | 120.00 | 100.00 |
2 | 2023-01-05 | 180.00 | 150.00 |
6. FIRST_VALUE() 和 LAST_VALUE()
- 返回窗口内的第一个或最后一个值。
SELECT
product_id,
sale_date,
amount,
FIRST_VALUE(amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS first_amount
FROM sales;
查询结果
product_id | sale_date | amount | first_amount |
1 | 2023-01-01 | 100.00 | 100.00 |
2 | 2023-01-02 | 150.00 | 150.00 |
3 | 2023-01-03 | 150.00 | 150.00 |
1 | 2023-01-04 | 120.00 | 100.00 |
2 | 2023-01-05 | 180.00 | 150.00 |
请注意,OVER()子句可以包含PARTITION BY来定义窗口内的分区,每个分区都独立地应用窗口函数。
SELECT
product_id,
sale_date,
amount,
SUM(amount) OVER (PARTITION BY product_id) AS total_amount_per_product
FROM sales;
在这个例子中,SUM(amount)函数在每个product_id分区内独立计算。
查询结果
product_id | sale_date | amount | total_amount_per_product |
1 | 2023-01-01 | 100.00 | 220.00 |
2 | 2023-01-02 | 150.00 | 330.00 |
3 | 2023-01-03 | 150.00 | 150.00 |
1 | 2023-01-04 | 120.00 | 220.00 |
2 | 2023-01-05 | 180.00 | 330.00 |
总结
窗口函数在处理涉及多个行但不需要进行复杂分组或连接的问题时非常有用,比如计算运行总计、排名或查找前一行/后一行的值等。
相关文章:
MySQL窗口函数:从理论到实践
目录 1. ROW_NUMBER() 2. RANK() 3. DENSE_RANK() 4. NTILE(n) 5. LAG() 和 LEAD() 6. FIRST_VALUE() 和 LAST_VALUE() 总结 MySQL中的窗口函数(Window Functions)允许用户对一个结果集的窗口(或分区)执行计算,…...

Vue+SpringBoot打造考研专业课程管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…...

python基础第二天
世界杯小组赛成绩 注意: 1.循环 1.1while 1.2for 1.3 range 1.4 while else while 循环正常执行完才能执行else语句...

YOLOV9论文解读
代码:https://github.com/WongKinYiu/yolov9论文:https://arxiv.org/abs/2402.1361本文提出可编程梯度信息(PGI)和基于梯度路径规划的通用高效层聚合网络(GELAN),最终铸成YOLOv9目标检测全新工作!性能表现SOTA!在各个方…...
【Spring】21 通过@Primary注解优化注解驱动的自动装配
文章目录 Primary注解简介优势和适用场景小结 Spring 框架提供了强大的依赖注入机制,其中 Autowired 注解是一种常用的方式。然而,当存在多个候选 bean 时,通过类型自动装配可能导致选择困难。为了更好地控制这一过程,Spring 引入…...

【HTML】HTML基础7.3(自定义列表)
目录 标签 效果 代码 注意 标签 <dl> <dt>自定义标题</dt><dd>内容1</dd><dd>内容2</dd><dd>内容3</dd> 。。。。。。 </dl> 效果 代码 <dl><dt>蜘蛛侠系列</dt><dd>蜘蛛侠1</dd…...
java设计模式课后作业(待批改)
此文章仅记录学习,欢迎各位大佬探讨 实验(一) 面向对象设计 实验目的 ①使用类来封装对象的属性和功能; ②掌握类变量与实例变量,以及类方法与实例方法的区别; 知识回顾 详情见OOP课件 实验内容…...
qt 语音引擎 QTextToSpeech Microsoft SAPI
QT中语音播报的代码 在QT中实现语音播报可以使用QTextToSpeech类,具体代码如下: #include <QCoreApplication> #include <QTextToSpeech> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创…...
react hook: useimperativeHandle
通过 useImperativeHandle,子组件可以选择性地暴露给父组件某些属性或方法,而不是将所有属性和方法暴露出去。 父组件 获得自组件的 ref,就能通过该 ref 来调用 focus来聚焦等功能 在 forwardRef 包装的组件中,ref 固定地是第二个…...
30天自制操作系统(第28天)
28.1 alloca __alloca 会在下述情况下被 C 语言的程序调用(采用 near-CALL 的方式)。 1、要执行的操作从栈中分配 EAX 个字节的内存空间( ESP - EAX; ) 2、要遵守的规则不能改变 ECX 、 EDX 、 EBX 、 EBP 、 ESI 、 EDI的值&am…...

Nginx启动服务
Nginx启动服务 一、启动前置 下载地址 如已安装Docker,下一步拉取Nginx最新的Docker镜像: docker pull nginx:latest查看拉取下来的镜像: docker images二、启动服务 创建Docker容器: docker run --name {projectname} -p 80…...

coqui-ai/TTS 案例model文件
GitHub - coqui-ai/TTS: 🐸💬 - a deep learning toolkit for Text-to-Speech, battle-tested in research and production Coqui AI的TTS是一款开源深度学习文本转语音工具,以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&…...
如何利用API接口进行高效的商品变体管理?
要利用API接口进行高效的商品变体管理,您需要执行一系列策略和技术步骤来确保数据的准确性和实时性。以下是详细的指南: 1. 确定变体管理需求 分析产品:识别具有变体的产品,并明确这些变体的属性(如尺寸、颜色、材质…...

扼杀网络中的环路:STP、RSTP、MSTP
目录 前言: 一、STP(Spanning Tree Protocol) 1.1 STP功能 1.2 STP应用 二、RSTP(Rapid Spanning Tree Protocol) 2.1 RSTP功能 2.2 RSTP应用 三、MSTP(Multiple Spanning Tree Protocol࿰…...

青少年如何从零开始学习Python编程?有它就够了!
文章目录 写在前面青少年为什么要学习编程 推荐图书图书特色内容简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家带来一本非常适合青少年学习编程的图书,快来看看吧~ 青少年为什么要学习编程 青少年学习编程,就好比在他们年轻时就开始掌握一种…...

触发HTTP preflight预检及跨域的处理方法
最近在做需求的过程中,遇到了很多跨域和HTTP预检的问题。下面对我所遇到过的HTTP preflight和跨域的相关问题进行总结: 哪些情况会触发HTTP preflight preflight属于cors规范的一部分,在有跨域的时候,在一定情况下会触发preflig…...
【算法可视化】搜索算法专题
运行平台 Algorithm Visualizer 选数 [NOIP2002 普及组] 选数 // 导入可视化库 { const { Tracer, Array1DTracer, LogTracer, Layout, VerticalLayout } require(algorithm-visualizer); // }const N 4, K 3; //从包含4个元素的集合中选出3个数 let ans 0 //方案数 co…...

编写dockerfile挂载卷、数据容器卷
编写dockerfile挂载卷 编写dockerfile文件 [rootwq docker-test-volume]# vim dockerfile1 [rootwq docker-test-volume]# cat dockerfile1 FROM centosVOLUME ["volume01","volume02"]CMD echo "------end------" CMD /bin/bash [rootwq dock…...

理解OAuth 2.0
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 一、应用场景 为了…...
8. Go实现Gin服务优雅关机与重启
文章目录 优雅关机优雅重启 无论是优雅关机还是优雅重启归根结底都是通过监听特定系统信号,然后执行一定的逻辑处理保障当前系统正在处理的请求被正常处理后再关闭当前进程。 优雅关机 优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...