尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MySQL 中的窗口函数
窗口函数是 MySQL 8.0 引入的一个重要特性它可以在不改变数据行数的前提下对每一行数据进行聚合、排名、累积等计算。与GROUP BY不同窗口函数会保留所有原始行。一、窗口函数窗口函数的执行逻辑是在每一行数据上基于“窗口”一个定义好的数据范围进行计算然后把计算结果的附加列如排名、累计值等直接写到对应的行上不合并行。语法结构SELECT 列名, 窗口函数() OVER ( PARTITION BY 分区列 -- 分组 ORDER BY 排序列 -- 排序 ROWS/RANGE BETWEEN ... -- 窗口范围 ) AS 别名 FROM 表名;二、窗口函数的三大类别1. 排名函数函数说明ROW_NUMBER()按顺序编号不处理并列1,2,3,4...RANK()跳跃排名并列后跳过1,1,3,4...DENSE_RANK()连续排名并列后不跳过1,1,2,3...NTILE(n)将数据分成 n 组返回组号示例按成绩排名-- 创建示例表 CREATE TABLE students ( id INT, name VARCHAR(50), score INT, class VARCHAR(10) ); INSERT INTO students VALUES (1, Alice, 95, A), (2, Bob, 85, A), (3, Charlie, 95, A), (4, David, 78, B), (5, Eva, 92, B), (6, Frank, 85, B); -- 各排名函数的对比 SELECT name, score, ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num, RANK() OVER (ORDER BY score DESC) AS rank, DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank, NTILE(3) OVER (ORDER BY score DESC) AS ntile FROM students;结果-------------------------------------------------- | name | score | row_num | rank | dense_rank | ntile | -------------------------------------------------- | Alice | 95 | 1 | 1 | 1 | 1 | | Charlie | 95 | 2 | 1 | 1 | 1 | | Eva | 92 | 3 | 3 | 2 | 2 | | Bob | 85 | 4 | 4 | 3 | 2 | | Frank | 85 | 5 | 4 | 3 | 3 | | David | 78 | 6 | 6 | 4 | 3 | --------------------------------------------------区别ROW_NUMBER()1,2,3,4,5,6RANK()1,1,3,4,4,6DENSE_RANK()1,1,2,3,3,4NTILE(3)1,1,2,2,3,32. 聚合函数作为窗口函数函数说明SUM()窗口内的累计和AVG()窗口内的平均值COUNT()窗口内的行数MAX()/MIN()窗口内的最大值/最小值示例累计求和与移动平均SELECT date, sales, SUM(sales) OVER (ORDER BY date) AS cumulative_sales, AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg_3 FROM sales_data;3. 取值函数函数说明LAG()获取当前行之前的第 N 行LEAD()获取当前行之后的第 N 行FIRST_VALUE()窗口内的第一行LAST_VALUE()窗口内的最后一行示例计算环比增长率SELECT month, revenue, LAG(revenue, 1) OVER (ORDER BY month) AS prev_month_revenue, ROUND( (revenue - LAG(revenue, 1) OVER (ORDER BY month)) / LAG(revenue, 1) OVER (ORDER BY month) * 100, 2 ) AS growth_rate_percent FROM monthly_revenue;三、PARTITION BY分组计算PARTITION BY将数据分组窗口函数在每个分组内独立计算。SELECT class, name, score, RANK() OVER (PARTITION BY class ORDER BY score DESC) AS rank_in_class FROM students;结果-------------------------------------- | class | name | score | rank_in_class | -------------------------------------- | A | Alice | 95 | 1 | | A | Charlie | 95 | 1 | | A | Bob | 85 | 3 | | B | Eva | 92 | 1 | | B | Frank | 85 | 2 | | B | David | 78 | 3 | --------------------------------------四、窗口范围Frame窗口范围决定计算时包含哪些行写法说明ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW从开始到当前行默认累计ROWS BETWEEN 2 PRECEDING AND CURRENT ROW当前行及前 2 行ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING前 1 行 当前行 后 1 行ROWS UNBOUNDED PRECEDING从开始到当前行的简写RANGE BETWEEN ...基于值的范围而不是行数SELECT date, sales, SUM(sales) OVER (ORDER BY date) AS cumulative, -- 默认从开始到当前 SUM(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS last_3_days, SUM(sales) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS total_all FROM sales_data;五、窗口函数 vs GROUP BY对比维度GROUP BY窗口函数OVER()行数变化合并行行数减少保持原行数结果位置单独的结果行附加在原行旁边子查询需求常需要子查询不需要适用场景汇总统计排名、累计、移动平均-- GROUP BY只能看到汇总结果 SELECT department, AVG(salary) FROM employees GROUP BY department; -- 窗口函数每行都保留同时显示平均工资 SELECT employee_id, name, department, salary, AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary FROM employees;
RELATED

相关推荐

Hermes‑Agent(自进化agent)浅析

Hermes‑Agent(自进化agent)浅析

第一部分 项目定位 1.1 框架定位:可以随使用自我成长的 AI Agent Hermes 的定位用一句话就能说清:“The Agent That Grows With You”——一个会随着使用不断自我成长的 AI Agent 框架。 市面上绝大多数 Agent 框架是"静态"的:你给…

📅 2026/10/23 20:29:19
吉特WMS性能优化实战:48小时解决卡顿与盘点差异

吉特WMS性能优化实战:48小时解决卡顿与盘点差异

简介:本资源为面向企业IT运维工程师、仓储系统开发人员及智能制造领域技术实施者的吉特仓储管理系统深度优化方案实践包,聚焦解决传统仓储管理中数据响应迟滞、货位规划低效、库存监控滞后与自动化集成薄弱等核心痛点。压缩包共2000个文件,33…

📅 2026/9/11 23:41:43
2026前端面试风向:从背题到深度理解与项目实战

2026前端面试风向:从背题到深度理解与项目实战

2026年了,前端面试真的是变天了。如果你还在按照前几年那种“背题刷面经”的方式准备,大概率会非常难受。我今年帮几个朋友做面试复盘,也和一些大厂的前端负责人聊过,大家有一个共识:只看“八股文”已经没法判断一个人…

📅 2026/9/7 23:03:16
MORE NEWS

更多资讯

📰

青田县电工证培训通过率揭秘:证书过期了不知道怎么复审延期

青田县电工证培训通过率揭秘:证书过期了不知道怎么复审延期 你是不是也遇到过这种情况?电工证到期了,但你根本不知道该怎么复审,更别说延期了。别急,这篇文章就是为你准备的。青田县电工证培训的通过率揭秘,以及复审、继续教育、岗位职责这些干货,我都…

📰

2026河南最新政策下特种电工作业教学怎么安排才不耽误工地进度

2026河南最新政策下特种电工作业教学怎么安排才不耽误工地进度 工地太忙根本没时间复习考试,这句话说出了多少一线电工的心声。尤其是在2026河南最新政策下,特种电工作业教学的要求更严格了,复习和备考的时间被进一步压缩。作为周口应届工程类毕业…

📰

在昆山哪里学电工证怎么选机构才能不被坑 考前押题攻略全公开

在昆山哪里学电工证怎么选机构才能不被坑 考前押题攻略全公开 你是不是也这样,听说要考电工证,结果一查信息,满屏都是培训机构,价格五花八门,还有一堆“包过”“保证下证”之类的承诺,让你摸不着头脑? 在昆山哪里学电工证…

📰

电工证审理怎么查询保姆级教程:别被中介骗了,自己查更靠谱

电工证审理怎么查询保姆级教程:别被中介骗了,自己查更靠谱 你是不是也遇到过这种情况?拿着手机搜“电工证审理怎么查询”,结果一堆中介电话轰炸,说啥“包过”“包办”“免审核”,听起来靠谱,但一交钱就没了下文。其实,查电工证审理状态这件事,…

📰

河源连平电工证换证怎么考,全国通用怎么拿?

河源连平电工证换证怎么考,全国通用怎么拿? 实操考试心里没底怕挂科?别慌,换证流程其实没那么复杂。尤其是对在河源连平从事电工工作的你来说, 全国通用…

📰

任县电工证怎么复审官方报名入口在哪找

任县电工证怎么复审官方报名入口在哪找 怕考不过白交培训费?任县电工证复审流程不复杂,但很多人因为不了解官方报名入口,反而耽误了时间,甚至错过了复审期限,导致证书失效影响工作。其实只要掌握流程、找准官方报名入口,复审并不难。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬