窗口函数可在不改变原始数据行数的情况下进行排名、累计求和、移动平均等分析。其语法为function_name() OVER (PARTITION BY col ORDER BY col),支持RANK()、ROW_NUMBER()、SUM() OVER()等函数,适用于MySQL 8.0+。与GROUP BY不同,窗口函数保留每行数据并增加计算列,常用于Top N、同比环比、移动平均等场景,配合索引和合理窗口设计可提升性能。

MySQL窗口函数,简单来说,就是让你在查询结果的“窗口”内进行计算,而不用像GROUP BY那样把数据聚合起来。它既能保留原始数据的完整性,又能进行灵活的分析,简直是数据分析的利器!
窗口函数让你在不改变原始数据行的情况下,进行诸如排名、累计求和、移动平均等操作。
解决方案
窗口函数的基本语法是:
function_name() OVER (PARTITION BY column1 ORDER BY column2)。
function_name():你要使用的窗口函数,比如
RANK()、
SUM()、
*G()等等。
OVER():定义窗口的范围。
PARTITION BY column1:将数据按照
column1进行分组,每个分组就是一个窗口。如果没有
PARTITION BY,则整个结果集就是一个窗口。
ORDER BY column2:在每个窗口内,按照
column2进行排序。
几个常用的窗口函数:
ROW_NUMBER():为每个窗口内的行分配一个唯一的序号,从1开始。
RANK():为每个窗口内的行分配排名,相同的值排名相同,但会跳过后续排名。
DENSE_RANK():与
RANK()类似,但相同的值排名相同,不会跳过后续排名。
NTILE(n):将每个窗口内的行分成
n组,并为每行分配一个组号。
SUM() OVER():计算窗口内的累计和。
*G() OVER():计算窗口内的平均值。
LAG(column, n, default):返回当前行之前
n行的
column值,如果没有前
n行,则返回
default。
LEAD(column, n, default):返回当前行之后
n行的
column值,如果没有后
n行,则返回
default。
举个例子:
假设我们有一个
sales表,包含
date(销售日期)、
region(销售区域)和
amount(销售额)三个字段。
CREATE TABLE sales (
date DATE,
region VARCHAR(20),
amount DECIMAL(10, 2)
);
INSERT INTO sales (date, region, amount) VALUES
('2025-01-01', 'North', 100.00),
('2025-01-01', 'South', 150.00),
('2025-01-02', 'North', 120.00),
('2025-01-02', 'South', 180.00),
('2025-01-03', 'North', 110.00),
('2025-01-03', 'South', 200.00);1. 计算每个区域的销售额排名:
SELECT
date,
region,
amount,
RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS sales_rank
FROM
sales;这个查询会按照
region分组,然后在每个区域内按照
amount降序排列,并计算每个销售额的排名。
2. 计算每个区域的累计销售额:
SELECT
date,
region,
amount,
SUM(amount) OVER (PARTITION BY region ORDER BY date) AS cumulative_sales
FROM
sales;这个查询会按照
region分组,然后在每个区域内按照
date排序,并计算每天的累计销售额。
3. 计算每个区域的移动平均销售额(过去三天):
SELECT
date,
region,
amount,
*G(amount) OVER (PARTITION BY region ORDER BY date ASC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_*erage
FROM
sales;这个查询会按照
region分组,然后在每个区域内按照
date排序,并计算过去三天的移动平均销售额。
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW定义了窗口的范围,表示当前行和前两行。
Magick
无代码AI工具,可以构建世界级的AI应用程序。
225
查看详情
MySQL 8.0 之后才开始支持窗口函数,如果你的MySQL版本低于8.0,需要升级才能使用。
MySQL窗口函数有哪些常见的应用场景?
窗口函数在数据分析中应用广泛,可以解决很多复杂的排名、统计和比较问题。
窗口函数能做到的,很多情况下使用子查询或者临时表也能实现,但窗口函数通常更简洁、更高效。
如何优化MySQL窗口函数的性能?
窗口函数虽然强大,但如果使用不当,也可能导致性能问题。
PARTITION BY和
ORDER BY子句中使用的列都有索引。
ORDER BY子句。
窗口函数和GROUP BY的区别是什么?
GROUP BY和窗口函数都是用于数据聚合和分析的,但它们之间有本质的区别。
GROUP BY会将数据按照指定的列进行分组,然后对每个分组进行聚合计算,最终只返回每个分组的一行结果。
简单来说,
GROUP BY是改变数据的行数,而窗口函数是增加数据的列数。
什么时候应该使用窗口函数,什么时候应该使用GROUP BY?
GROUP BY。
总的来说,选择哪个取决于你的具体需求。 窗口函数在需要保留原始数据的详细信息,并同时进行聚合计算时,优势非常明显。
以上就是MySQL窗口函数入门到精通:实现复杂数据分析与排名的详细内容,更多请关注其它相关文章!
相关文章:
Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025
Mac终端命令大全_Mac常用Terminal指令速查
抖音网页版怎么|直播|_抖音网页版开播操作指南
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
铁路12306的积分有效期是多久_铁路12306积分有效期说明
Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议
CSS实现侧边栏导航项全宽圆角悬停背景效果
J*aScript实现单选按钮与关联输入框的联动禁用教程
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
PHP表单隐藏域数据传递:常见问题与最佳实践
天眼查企业查询官网入口 天眼查官方网页版查询
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
DLsite中文平台入口 DLsite官网内容在线查看
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
AO3官方在线访问地址 Archive of Our Own最新镜像合集
支付宝如何设置安全保护_支付宝安全设置的全面教程
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
J*a里如何使用forEach遍历Map_Map遍历方法说明
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
12306选座系统怎么选连座_12306选座多人连坐操作方法
基于动态规划的房屋花卉种植最小成本算法详解
深入理解J*a合成构造器:何时以及为何阻止其生成
FullCalendar 自定义按钮样式定制指南
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
照顾宝贝2小游戏免费秒玩入口
绝地鸭卫平a核爆刀流玩法攻略
狙击外星人小游戏开始_狙击外星人小游戏立即开始
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
解决J*aScript中重复选择项的确认对话框显示问题
Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
J*aScript中向JSON对象添加新属性的正确姿势
微信商城在哪里打开【步骤】
12306选座如何查看座位示意图_12306座位示意图解读与使用
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】
Python异步编程实践:使用Binance API构建实时交易数据流
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践