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服务优雅关机与重启
文章目录 优雅关机优雅重启 无论是优雅关机还是优雅重启归根结底都是通过监听特定系统信号,然后执行一定的逻辑处理保障当前系统正在处理的请求被正常处理后再关闭当前进程。 优雅关机 优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在…...
基于SpringBoot + Vue的新农村信息平台建设(角色:企业村民村委会管理员)
文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 💛博主介绍&#…...
[系统激活]问题的[KMS解决方案]:企业级授权管理的本地实现
[系统激活]问题的[KMS解决方案]:企业级授权管理的本地实现 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 一、场景痛点分析 1.1 个人用户激活困境矩阵 场景传统激活方式痛点描述影…...
OpenFly实战:如何用无人机视觉语言导航工具链快速生成10万条训练数据
OpenFly实战:无人机视觉语言导航数据生成的10倍效率革命 当无人机开始理解人类语言指令时,一场人机交互的革命正在悄然发生。去年在深圳某科技园区,一组工程师仅用72小时就完成了过去需要三个月的数据采集工作——他们使用的秘密武器正是Open…...
如何通过有效方法提升儿童专注力障碍的注意力集中度?
提升儿童专注力的有效策略与技巧解析 在帮助儿童提高注意力集中度的过程中,首先需要建立一个适合学习的环境。创造一个安静、整洁的学习空间,减少杂音和干扰,有助于孩子更好地专注。此外,开展一些分段学习的小技巧也是非常有效的方…...
MSG文件高效提取工具:解放双手的Outlook邮件解析方案
MSG文件高效提取工具:解放双手的Outlook邮件解析方案 【免费下载链接】msg-extractor Extracts emails and attachments saved in Microsoft Outlooks .msg files 项目地址: https://gitcode.com/gh_mirrors/ms/msg-extractor 副标题:你是否还在为…...
s3fs-fuse架构深度解析:如何通过FUSE实现云端存储的本地化操作
s3fs-fuse架构深度解析:如何通过FUSE实现云端存储的本地化操作 【免费下载链接】s3fs-fuse FUSE-based file system backed by Amazon S3 项目地址: https://gitcode.com/gh_mirrors/s3/s3fs-fuse 在现代云计算环境中,对象存储服务如Amazon S3已经…...
利用快马平台快速构建openclaw网页抓取原型,十分钟验证技术方案
最近在做一个数据采集相关的项目,需要快速验证网页抓取方案的可行性。经过调研发现openclaw这个Python库很适合做轻量级的网页抓取,但搭建完整的开发环境太费时间。后来在InsCode(快马)平台上尝试了一下,没想到十分钟就搞定了原型验证。这里分…...
Linux 系统调用实现原理
Linux 系统调用实现原理 系统调用的重要性 作为科技创业者,我深刻理解系统调用在操作系统中的核心地位。系统调用是用户空间与内核空间交互的桥梁,是应用程序访问操作系统服务的唯一途径。深入理解系统调用的实现原理,对于系统性能优化和安全…...
ai赋能安装:让快马生成智能交互式mysql安装故障排查助手
AI赋能安装:让快马生成智能交互式MySQL安装故障排查助手 MySQL作为最流行的开源数据库之一,安装过程看似简单,但实际会遇到各种"坑"。新手经常被报错信息搞得一头雾水,老手也可能在特定环境下翻车。传统教程都是静态的…...
LIBERO Benchmark自定义任务避坑指南:手把手教你从零构建厨房场景的BDDL文件
LIBERO Benchmark厨房任务BDDL实战:从场景拆解到避坑全流程 当你第一次打开LIBERO Benchmark的文档,面对那些复杂的项目结构和晦涩的术语时,是否感到无从下手?本文将以一个具体的厨房场景任务为例——"打开橱柜放入杯子&quo…...
