当前位置: 首页 > news >正文

MySQL 窗口函数:功能、使用场景与性能优化

 

 

MySQL 8.0 引入了一个强大的新特性——**窗口函数(Window Functions)**。它为数据分析和复杂查询提供了极大的便利,但同时也可能带来性能问题。本文将带你快速了解窗口函数的功能、使用场景以及如何优化性能。

 

---

 

## **什么是窗口函数?**

 

窗口函数是一种特殊的 SQL 函数,用于在查询结果集上执行复杂的分析操作。与传统的聚合函数(如 `SUM()`、`AVG()`)不同,窗口函数不会合并行,而是保留每一行的数据,同时允许对一组相关行进行计算。

 

### **基本语法**

```sql

function_name(expression) OVER (

    [PARTITION BY partition_expression]

    [ORDER BY sort_expression]

    [ROWS|RANGE BETWEEN start AND end]

)

```

 

- **`function_name`**:窗口函数名称,例如 `ROW_NUMBER()`、`RANK()`、`SUM()`。

- **`OVER()`**:定义窗口范围的关键字。

  - **`PARTITION BY`**:分组,类似于 `GROUP BY`,但不会合并行。

  - **`ORDER BY`**:指定窗口内的排序规则。

  - **`ROWS/RANGE BETWEEN`**:定义窗口的边界范围。

 

---

 

## **窗口函数的主要功能**

 

### **1. 排名类函数**

用于计算行的排名或顺序:

- **`ROW_NUMBER()`**:为每一行分配一个唯一的序号。

- **`RANK()`**:根据排序规则分配排名,相同值的行排名相同,后续排名会跳过。

- **`DENSE_RANK()`**:与 `RANK()` 类似,但不会跳过后续排名。

 

**示例:生成学生分数排名**

```sql

SELECT 

    id, 

    score,

    RANK() OVER (ORDER BY score DESC) AS rank_num

FROM students;

```

 

---

 

### **2. 聚合类函数**

用于在窗口范围内进行聚合计算:

- **`SUM()`**:累计求和。

- **`AVG()`**:移动平均。

- **`MIN()` 和 `MAX()`**:最小值和最大值。

 

**示例:计算累计销售额**

```sql

SELECT 

    id, 

    sale_amount,

    SUM(sale_amount) OVER (ORDER BY id) AS cumulative_sum

FROM sales;

```

 

---

 

### **3. 偏移类函数**

用于访问当前行之前或之后的行:

- **`LAG(column)`**:获取当前行之前的值。

- **`LEAD(column)`**:获取当前行之后的值。

 

**示例:比较当前行与前一行的分数**

```sql

SELECT 

    id, 

    score,

    LAG(score) OVER (ORDER BY id) AS prev_score

FROM students;

```

 

---

 

## **窗口函数的使用场景**

 

1. **排行榜**:按分数或其他指标生成排名。

2. **累计计算**:如累计销售额、累计用户数。

3. **移动平均**:如时间序列数据分析。

4. **前后行比较**:如环比增长率、同比分析。

 

---

 

## **窗口函数的性能问题**

 

尽管窗口函数功能强大,但在处理大数据集时可能会遇到性能瓶颈。以下是常见问题及优化方法:

 

### **1. 全表扫描**

窗口函数通常需要对整个结果集进行排序或分组操作,可能导致全表扫描。  

**优化方法**:为排序字段创建索引,减少扫描开销。

 

```sql

CREATE INDEX idx_score ON students(score);

```

 

---

 

### **2. 排序开销**

窗口函数的核心操作之一是排序,复杂度为 **O(n log n)**。  

**优化方法**:

- 使用索引优化排序。

- 缩小初始数据集,提前过滤掉不需要的行。

 

```sql

WITH FilteredData AS (

    SELECT * FROM students WHERE score > 80

)

SELECT 

    id, 

    score,

    RANK() OVER (ORDER BY score DESC) AS rank_num

FROM FilteredData;

```

 

---

 

### **3. 分区计算**

`PARTITION BY` 会增加计算复杂度,只有在必要时才使用。  

**优化方法**:避免不必要的分区。

 

---

 

### **4. 窗口范围定义**

`ROWS BETWEEN` 性能优于 `RANGE BETWEEN`,尽量选择前者。

 

```sql

-- 高效

SUM(score) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

 

-- 较低效

SUM(score) OVER (ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

```

 

---

 

### **5. 分页优化**

窗口函数与分页结合时,可以通过嵌套查询或临时表优化性能。

 

```sql

WITH RankedData AS (

    SELECT 

        id, 

        score,

        RANK() OVER (ORDER BY score DESC) AS rank_num

    FROM students

)

SELECT *

FROM RankedData

WHERE rank_num BETWEEN 21 AND 30; -- 分页:第 21 到第 30 名

```

 

---

 

## **总结**

 

MySQL 窗口函数是一项强大的工具,能够帮助开发者轻松实现复杂的分析操作,如排名、累计计算和前后行比较等。然而,在处理大数据集时需要注意性能问题。通过以下优化策略,可以显著提升查询效率:

1. 使用索引优化排序。

2. 缩小初始数据集。

3. 避免不必要的分区。

4. 选择合适的窗口范围。

5. 优化分页逻辑。

 

希望本文能帮助你更好地理解和使用 MySQL 窗口函数!如果你正在处理需要复杂计算的查询,不妨尝试一下窗口函数,它会让你的 SQL 查询更加高效和优雅!

相关文章:

MySQL 窗口函数:功能、使用场景与性能优化

MySQL 8.0 引入了一个强大的新特性——**窗口函数(Window Functions)**。它为数据分析和复杂查询提供了极大的便利,但同时也可能带来性能问题。本文将带你快速了解窗口函数的功能、使用场景以及如何优化性能。 --- ## **什么是窗口函数&#…...

数据权限校验实践

数据权限控制实践 最近在实习中为公司项目完成一个文件数据权限校验代码的转换重构,写这篇博客来记录前后两种权限校验的实现方案与相关概念 原实现方案:RBAC-基于角色的访问控制 RBAC(Role-Based Access Control) RBAC 是一种常…...

spring boot对接clerk 实现用户信息获取

在现代Web应用中,用户身份验证和管理是一个关键的功能。Clerk是一个提供身份验证和用户管理的服务,可以帮助开发者快速集成这些功能。在本文中,我们将介绍如何使用Spring Boot对接Clerk,以实现用户信息的获取。 1.介绍 Clerk提供…...

公网远程家里局域网电脑过程详细记录,包含设置路由器。

由于从校内迁居小区,校内需要远程控制访问小区内个人电脑,于是早些时间刚好自己是电信宽带,可以申请公网ipv4不需要花钱,所以就打电话直接申请即可,申请成功后访问光猫设备管理界面192.168.1.1,输入用户名密码登录超管(密码是网上查下就有了)设置了光猫为桥接模式,然后…...

自制简单的图片查看器()

图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...

25/2/17 <嵌入式笔记> 桌宠代码解析

这个寒假跟着做了一个开源的桌宠,我们来解析下代码,加深理解。 代码中有开源作者的名字。可以去B站搜着跟着做。 首先看下main代码 #include "stm32f10x.h" // Device header #include "Delay.h" #include &quo…...

Kafka偏移量管理全攻略:从基础概念到高级操作实战

#作者:猎人 文章目录 前言:概念剖析kafka的两种位移消费位移消息的位移位移的提交自动提交手动提交 1、使用--to-earliest重置消费组消费指定topic进度2、使用--to-offset重置消费offset3、使用--to-datetime策略指定时间重置offset4、使用--to-current…...

python中使用日期和时间差:datetime模块

datetime模块的表示时间的有 datetime.datetime #时间包含年月日时分秒毫秒 datetime.date #时间只包含年月日 datetime.time #只包含时分秒 获取当前时间 import datetime now datetime.datetime.now() print(now)得到 atetime中的年月日时分秒可以分别取出来 import da…...

申论对策建议类【2022江苏B卷第一题“如何开展网络直播”】

材料: 近年来,公安交管部门通过网络直播,将执法过程和执法细节以视频形式呈现在公众面前,吸引“围观”、组织点评,让执法过程变成一堂生动的法治公开课。 “各位网友,大家好!这里是‘全国交通…...

Blazor-父子组件传递任意参数

在我们从父组件传参数给子组件时,可以通过子组件定义的[Parameter]特性的公开属性进行传值,但是当我们需要传递多个值的时候,就需要通过[Parameter]特性定义多个属性,有没有更简便的方式? 我们可以使用定义 IDictionar…...

Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅

摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…...

win11安装wsl报错:无法解析服务器的名称或地址(启用wsl2)

1. 启用wsl报错如下 # 查看可安装的 wsl --install wsl --list --online此原因是因为没有开启DNS的原因,所以需要我们手动开启DNS。 2. 按照如下配置即可 Google的DNS(8.8.8.8和8.8.4.4) 全国通用DNS地址 (114.114.114.114) 3. 运行以下命令来重启 WSL…...

【设计模式】【结构型模式】桥接模式(Bridge)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...

1997-2019年各省进出口总额数据

1997-2019年各省进出口总额数据 1、时间:1997-2020年 2、来源:国家统计局、各省年鉴 3、指标:进出口总额 4、范围:31省 5、指标解释:进出口总额‌是指以货币表示的一定时期内一国实际进出口商品的总金额&#xff…...

AI前端开发效率革命:拥抱AI,开启前端开发新纪元

前端开发行业竞争日益激烈,项目交付周期不断缩短,对开发效率的要求也越来越高。在这种高压环境下,开发者们常常面临着巨大的压力。而近年来,人工智能技术的飞速发展,特别是AI写代码工具的出现,为前端开发带…...

Rust编程语言入门教程(一)安装Rust

目录 引言一、为什么要用 Rust?二、与其他语言比较三、Rust 特别擅长的领域四、Rust 与 Firefox五、Rust 的用户和案例六、Rust 的优缺点七、安装 Rust1、访问官网下载 Rust2、下载完成,执行exe文件 八、Rust 安装验证九、开发工具结束语 引言 在当今快…...

Kubernetes控制平面组件:Kubernetes如何使用etcd

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...

2025年-G4-Lc78--121. 买卖股票的最佳时机--(java版)

1.题目描述 2.思路 思路1: 做两轮排序,第一轮排序找到最小的那个数,然后再判断最小的那个数之后还有其他数吗,如果有在进行排序,选出最大的那个数,然后值相减。 问题要点: (1)你需要…...

LabVIEW 中的 3dgraph.llb 库

3dgraph.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下,是 LabVIEW 系统中用于 3D 图形相关操作的重要库。它为 LabVIEW 用户提供了丰富的功能,能在应用程序中创建、显示和交互各种 3D 图形,…...

通过VSCode直接连接使用 GPT的编程助手

GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条,超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下: 安装VSCODE 直接,官网下载就行 https://code.vis…...

[LeetCode力扣hot100]-C++常用数据结构

0.Vector 1.Set-常用滑动窗口 set<char> ans;//根据类型定义&#xff0c;像vector ans.count()//检查某个元素是否在set里&#xff0c;1在0不在 ans.insert();//插入元素 ans.erase()//删除某个指定元素 2.栈 3.树 树是一种特殊的数据结构&#xff0c;力扣二叉树相…...

2-安装YIUI

YIUI框架&#xff1a;GitHub - LiShengYang-yiyi/YIUI: Unity3D UGUI Framework, 基于UI数据事件绑定为核心 数据驱动的UGUI框架, ETUI框架, ET框架官方推荐UI框架 ET框架&#xff1a;egametang/ET: Unity3D Client And C# Server Framework (github.com) 1 - 安装YIUI框架&a…...

16-使用QtChart创建动态图表:入门指南

QtChart是Qt框架中的一个强大模块&#xff0c;用于创建各种类型的图表&#xff0c;如折线图、柱状图、饼图等。它提供了丰富的API和灵活的配置选项&#xff0c;使得开发者能够轻松地将数据可视化集成到应用程序中。本文将介绍如何使用QtChart创建一个简单的动态折线图&#xff…...

蓝耘智算携手DeepSeek,共创AI未来

&#x1f31f; 各位看官号&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习如何通过蓝耘智算使用DeepSeek R1模型 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&a…...

具身智能在智能巡检机器人中的应用——以开关柜带电操作机器人为例

随着机器人技术和人工智能的迅速发展&#xff0c;具身智能在各行业的应用日益广泛&#xff0c;尤其是在电力行业中的智能巡检领域。传统的电力巡检和维护工作通常需要人工操作&#xff0c;存在着高温、高压、强电磁场等危险环境&#xff0c;且效率较低。开关柜带电操作机器人作…...

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】

引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…...

【R语言】回归分析与判别分析

一、线性回归分析 1、lm()函数 lm()函数是用于拟合线性模型&#xff08;Linear Models&#xff09;的主要函数。线性模型是一种统计方法&#xff0c;用于描述一个或多个自变量&#xff08;预测变量、解释变量&#xff09;与因变量&#xff08;响应变量&#xff09;之间的关系…...

git开发流程以及github社区企业版

常规开发流程 1、将仓库 clone 到本地&#xff0c;已经 clone 的要 fetch & pull&#xff0c;保证本地 master 分支已经更新到最新状态 2、在 master 最新分支的基础上 checkout 一个开发分支&#xff0c;分支命名要求规范&#xff0c;如带用户名、日期、bug id 等关键信…...

DeepSeek + Vue实战开发

利用DeepSeek V3模型、siliconflow大模型一站式云服务平台以及vue3.0实现一个在线人工智能客服对话系统。 因为deepseek官网的api密钥使用起来比较缓慢&#xff0c;所以可以使用第三方的&#xff0c;具体操作请自行查阅资料。 siliconflow官网 SiliconFlow, Accelerate AGI …...

从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会

附录&#xff1a;所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…...

Python编程中,async/await/asyncio分别是干啥的?

在Python异步编程中,async、await和asyncio是三个核心概念。它们共同构成了Python处理高并发I/O密集型任务的解决方案。本文将通过代码实例解析它们的作用和用法。 一、异步编程基础 1.1 同步 vs 异步 同步编程:代码按顺序执行,遇到I/O操作(如网络请求、文件读写)时会阻塞…...

vue非组件的初学笔记

1.创建Vue实例&#xff0c;初始化渲染的核心 准备容器引包创建Vue实例new Vue() el用来指定控制的盒子data提供数据 2.插值表达式 作用利用表达式插值&#xff0c;将数据渲染到页面中 格式{{表达式}} 注意点 表达式的数据要在data中存在表达式是可计算结果的语句插值表达式…...

4.3 学习UVM中的“run_phase“,将其应用到具体案例分为几步?

文章目录 前言1. run_phase 的作用与执行特点2. 关键组件的 run_phase 实现2.1 Driver 的 run_phase&#xff1a;驱动事务2.2 Monitor 的 run_phase&#xff1a;捕获事务2.3 Scoreboard 的 run_phase&#xff1a;数据比对 3. 同步与 Objection 管理3.1 控制仿真结束3.2 多组件协…...

[Python人工智能] 五十.PyTorch入门 (5)快速搭建神经网络及模型保存

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建分类神经网络。这篇文章将介绍如何利用PyTorch快速构建神经网络,之前的代码比较复杂,通过自定义Net类实现,本文通过Torch函数定义神经网络。前面我们的Python人工智能主要以Tens…...

【C语言】有序数组的平方

文章目录 给你一个按非递减顺序排序的整数数组 nums&#xff0c;返回每个数字的平方组成的新数组&#xff0c;要求也按非递减顺序排序。 #include<stdio.h>/*** brief 计算一个整数数组的平方&#xff0c;并按非递减顺序存放结果* * 该函数接受一个整数数组arr和其长度le…...

osgearth视点坐标及鼠标交点坐标的信息显示(七)

核心函数如下: void COSGObject::addViewPointLabel() {//mRoot->addChild(osgEarth::Util::Controls::ControlCanvas::get(mViewer));//放开这句,球就卡住了。 为什么,shitosgEarth::Util::Controls::ControlCanvas* canvas = osgEarth::Util::Controls::ControlCanvas…...

【096】基于51单片机红外线人数统计系统【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统LCD1602液晶显示两路E18-D80NK红外线传感器DS1302时钟芯片AT24C02存储芯片蜂鸣器LED灯按键设置。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片&#xff1b; 2、采用DS1302时钟芯片实现对日期和时间的计时&#xff0c;并…...

【ENSP】链路聚合的两种模式

【ENSP】链路聚合的两种模式 1、背景介绍2、链路聚合的使用场景3、配置过程1、手工模式Eth-Trunk配置2、静态LACP模式Eth-Trunk 4、总结 1、背景介绍 随着网络规模的不断扩大&#xff0c;人们对骨干链路的带宽吞吐量和可靠性提出了越来越高的要求。在传统方案中&#xff0c;为…...

机器学习_17 K近邻算法知识点总结

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;是一种简单而直观的机器学习算法&#xff0c;广泛应用于分类和回归任务。它通过寻找训练集中与新样本最接近的K个样本&#xff08;近邻&#xff09;来进行预测。今天&#xff0c;我们就来深入探讨K近邻算法…...

Web 后端 请求与响应

一 请求响应 1. 请求&#xff08;Request&#xff09; 客户端向服务器发送的HTTP请求&#xff0c;通常包含以下内容&#xff1a; 请求行&#xff1a;HTTP方法&#xff08;GET/POST等&#xff09;、请求的URL、协议版本。 请求头&#xff08;Headers&#xff09;&#xff1a;…...

网络工程师 (44)ARP协议

前言 ARP协议&#xff0c;即地址解析协议&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是一种网络协议&#xff0c;主要用于将网络层的IPv4地址&#xff08;逻辑地址&#xff09;解析为链路层的物理地址&#xff08;通常是MAC地址&#xff09;。 一、基本概…...

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…...

搜狗浏览器卸载教程

需求背景 今天发现geek居然无法卸载搜狗浏览器&#xff0c;作为一个老司机&#xff0c;这是不允许的。如果你使用geek或者windows的卸载&#xff0c;或者直接在它的安装包的Uninstall.exe中卸载&#xff0c;他走到100%就一直不动了。那玩意是假的。 卸载教程 结束 -----华丽的…...

ES7 (ES2016) 新特性

目录 Array.prototype.includes()指数运算符与 ES6 的对比实际应用场景最佳实践 Array.includes() 基本语法 array.includes(searchElement[, fromIndex])特点 返回布尔值可以检测 NaN支持可选的 fromIndex 参数比 indexOf() 更语义化 使用示例 const numbers [1, 2, 3…...

设计模式13:职责链模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许将请求沿着处理者链传递&#xff0c;直到有一个处理者能够处理该请求。这种模式通过…...

MongoDB between ... and ... 操作

个人博客地址&#xff1a;​​​​​​​MongoDB between ... and ... 操作 | 一张假钞的真实世界 MongoDB中类似SQL的between and操作可以采用如下语法&#xff1a; db.collection.find( { field: { $gt: value1, $lt: value2 } } );...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_alloc函数

ngx_alloc 声明在 src\os\unix\ngx_alloc.h 中&#xff1a; void *ngx_alloc(size_t size, ngx_log_t *log); 定义在 src\os\unix\ngx_alloc.c 中&#xff1a; void * ngx_alloc(size_t size, ngx_log_t *log) {void *p;p malloc(size);if (p NULL) {ngx_log_error(NGX_LOG_…...

总结:Helm 命令详解

文章目录 1. Helm 概述2. Helm 的安装与配置2.1 安装 Helm2.2 验证安装 3、Helm 的常用命令3.1 查看帮助3.2 查看 Chart 列表3.3 安装 Chart3.4 卸载 Chart3.5 升级 Chart3.6 回滚 Chart3.7 查看 Chart 详细信息3.8 查看 Chart 的模板3.9 查看 Chart 的值3.10 管理仓库 4. Helm…...

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中&#xff0c;你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码&#xff0c;但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释&#xff1a; 一、数字含义&…...

【鸿蒙ArcTS】TypeScript学习记录:函数类型声明与箭头函数

普通函数 function add(x: number, y: number): number {return x y; } 完整未省略版本 const add: (x: number, y: number) > void//函数类型(x: number, y: number): void > {//函数定义console.log("object"); };函数类型&#xff1a; type trigFunc…...