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服务优雅关机与重启
文章目录 优雅关机优雅重启 无论是优雅关机还是优雅重启归根结底都是通过监听特定系统信号,然后执行一定的逻辑处理保障当前系统正在处理的请求被正常处理后再关闭当前进程。 优雅关机 优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在…...

SQL 注入攻击 - cookie base64编码注入
环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、Base64编码介绍 原理 Base64编码的原理是将三个字节的二进制数据(共24位)转换成四个ASCII字符。由于每个ASCII字符可以表示64种状态(2^6),刚好可以用来表示24位二进制数…...

Outlook邮箱后缀如何修改?怎么添加后缀?
Outlook邮箱后缀是什么?Outlook邮箱后缀可以改吗? Outlook邮箱广泛应用于企业和个人用户之间。在使用过程中,有时我们可能会因为某些原因需要修改Outlook邮箱后缀。那么,Outlook邮箱后缀如何修改呢?下面,A…...

[LeetBook]【学习日记】图书整理 II——用两个栈实现队列
题目 图书整理 II 读者来到图书馆排队借还书,图书管理员使用两个书车来完成整理借还书的任务。书车中的书从下往上叠加存放,图书管理员每次只能拿取书车顶部的书。排队的读者会有两种操作: push(bookID):把借阅的书籍还到图书馆。…...

5G智能制造食品工厂数字孪生可视化平台,推进食品行业数字化转型
5G智能制造食品工厂数字孪生可视化平台,推进食品行业数字化转型。随着科技的飞速发展,食品工业正迎来一场前所未有的数字化转型。在这场转型中,5G智能制造工厂数字孪生可视化平台发挥着至关重要的作用。它不仅提高了生产效率,降低…...

一个系列很多样式的wordpress外贸建站模板
菌菇干货wordpress跨境电商模板 食用菌、羊肚菌、牛肝菌、香菇、干黄花菜、梅干菜、松茸wordpress跨境电商模板。 https://www.jianzhanpress.com/?p3946 餐饮调味wordpress跨境电商模板 豆制品、蛋黄糖、烘焙、咖啡、调料、调味酱、餐饮调味wordpress跨境电商模板。 http…...

Wireshark_labs TCP
在本实验中,我们将详细研究著名的TCP协议的行为。我们将通过从您的电脑向远程服务器传输一份150KB 的文件(一份Lewis Carrol 的“爱丽丝梦游仙境”文本), 并分析TCP传输内容的发送和接收过程来实现。我们将研究TCP对序列和确认号的使用,以提供…...

Linux程序崩溃调试
一、简单点的 编译时主动带-g,生成的程序带调试信息,而且开启生成dump文件,这时候可以使用core dump来调试程序,定位问题。可以参考:linux 程序crash 调试、原因分析及问题定位-CSDN博客 二、稍微复杂点 假设生成的可执…...

Day37 socket、TCP、UDP
socket类型 流式套接字(SOCK_STREAM) TCP 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。 数据报套接字(SOCK_DGRAM) UD…...

从 Language Model 到 Chat Application:对话接口的设计与实现
作者:网隐 RTP-LLM 是阿里巴巴大模型预测团队开发的大模型推理加速引擎,作为一个高性能的大模型推理解决方案,它已被广泛应用于阿里内部。本文从对话接口的设计出发,介绍了业界常见方案,并分享了 RTP-LLM 团队在此场景…...

无人机|LQR控制算法及其无人机控制中的应用仿真
前言 LQR全称Linear Quadratic Regulator(线性二次调节器),顾名思义用于解决形如 x ˙ A x B u y C x D u \begin{aligned}\dot{x}&AxBu\\y&CxDu\end{aligned} x˙yAxBuCxDu 线性时不变系统的一种线性控制方法,…...