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服务优雅关机与重启
文章目录 优雅关机优雅重启 无论是优雅关机还是优雅重启归根结底都是通过监听特定系统信号,然后执行一定的逻辑处理保障当前系统正在处理的请求被正常处理后再关闭当前进程。 优雅关机 优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...