MySQL中常用的窗口函数有哪些 MySQL窗口函数详解与实战案例

mysql从8.0版本开始支持窗口函数,它能在不改变结果集行数的情况下进行计算,使数据分析更高效;1. 窗口函数通过over()定义计算范围,支持partition by分组和order by排序;2. 常见函数包括rank()、dense_rank()、row_number()等排序函数,sum()、avg()等聚合函数,lag()、lead()等偏移函数,以及first_value()、last_value()、ntile()等;3. rank()并列时跳过后续排名,dense_rank()不跳过,row_number()生成唯一序号;4. 聚合函数作为窗口函数可实现累计计算,如累计工资;5. lag()和lead()用于获取前后行数据,常用于差值分析;6. first_value()取窗口首值,last_value()需配合rows between unbounded preceding and unbounded following才能取窗口末值;7. ntile(n)将数据按序分为n桶,用于分层分析;8. 性能优化建议包括为partition by和order by列建立索引、避免复杂表达式、合理设定窗口范围并避免过度使用窗口函数;掌握这些内容可有效提升复杂查询的编写效率与执行性能。

MySQL中常用的窗口函数有哪些 MySQL窗口函数详解与实战案例

MySQL窗口函数,简单来说,就是在查询结果集上进行计算,但又不改变结果集的行数。它就像给你的数据加了一层“透视镜”,能让你看到更丰富的信息,而不用像GROUP BY那样改变数据的原始结构。

MySQL从8.0版本开始支持窗口函数,极大地增强了数据分析的能力。

MySQL窗口函数详解与实战案例

窗口函数是什么,为什么我们需要它?

想象一下,你要计算每个部门的工资排名,或者找出每个月销售额最高的几天。如果用传统的SQL,你需要各种子查询和连接,代码又长又难懂。窗口函数就像一个“神奇的盒子”,它能在你的原始数据上进行计算,然后把结果“贴”回每一行数据上。这样,你就能在同一行看到原始数据和计算结果,分析起来方便多了。

窗口函数的核心在于“窗口”的概念,它定义了计算的范围。这个范围可以是整个结果集,也可以是按照某种条件划分的子集。

MySQL常见的窗口函数有哪些?

MySQL提供了丰富的窗口函数,大致可以分为以下几类:

排序函数:

RANK()

,

DENSE_RANK()

,

ROW_NUMBER()

聚合函数:

SUM()

,

AVG()

,

MIN()

,

MAX()

,

COUNT()

分布函数:

PERCENT_RANK()

,

CUME_DIST()

偏移函数:

LAG()

,

LEAD()

首尾函数:

FIRST_VALUE()

,

LAST_VALUE()

其他函数:

NTH_VALUE()

,

NTILE()

这些函数的功能各不相同,但它们都遵循窗口函数的通用语法:

函数名(参数) OVER (PARTITION BY 列名 ORDER BY 列名)

PARTITION BY

用于将结果集划分为多个分区,窗口函数会在每个分区内独立计算。

ORDER BY

用于指定每个分区内的排序规则。如果没有

PARTITION BY

,则整个结果集被视为一个分区。

举个例子,假设我们有一个

employees

表,包含员工姓名、部门和工资:

name department salary

AliceSales5000BobSales6000CarolIT7000DavidIT8000EveSales5500

要计算每个部门的工资排名,可以使用以下SQL:

SELECT    name,    department,    salary,    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rankFROM    employees;

结果如下:

name department salary salary_rank

BobSales60001EveSales55002AliceSales50003DavidIT80001CarolIT70002

可以看到,

RANK()

函数在每个部门内按照工资降序进行了排名。

排序函数:RANK(), DENSE_RANK(), ROW_NUMBER() 的区别

这三个排序函数都用于计算排名,但它们的行为略有不同。

RANK()

:如果有并列排名,会跳过后续排名。例如,如果有两个第一名,则下一个排名是第三名。

DENSE_RANK()

:如果有并列排名,不会跳过后续排名。例如,如果有两个第一名,则下一个排名是第二名。

ROW_NUMBER()

:无论是否有并列排名,都会按照顺序生成唯一的排名。

继续上面的例子,如果我们在 Sales 部门添加一个工资为 6000 的员工 Frank:

name department salary

AliceSales5000BobSales6000FrankSales6000CarolIT7000DavidIT8000EveSales5500

使用不同的排序函数:

SELECT    name,    department,    salary,    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_rank,    DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_rank,    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_numberFROM    employees;

结果如下:

name department salary rank_rank dense_rank row_number

BobSales6000111FrankSales6000112EveSales5500323AliceSales5000434DavidIT8000111CarolIT7000222

可以看到,

RANK()

函数跳过了排名 2,而

DENSE_RANK()

函数没有跳过。

ROW_NUMBER()

函数则为每一行都生成了唯一的排名。

聚合函数作为窗口函数的应用场景?

SUM()

,

AVG()

,

MIN()

,

MAX()

,

COUNT()

这些聚合函数也可以作为窗口函数使用。 它们可以在窗口范围内进行聚合计算,并将结果返回到每一行。

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版 动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版 508 查看详情 动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

例如,要计算每个部门的累计工资:

SELECT    name,    department,    salary,    SUM(salary) OVER (PARTITION BY department ORDER BY salary) AS cumulative_salaryFROM    employees;

结果如下:

name department salary cumulative_salary

AliceSales50005000EveSales550010500BobSales600016500CarolIT70007000DavidIT800015000

SUM(salary) OVER (PARTITION BY department ORDER BY salary)

计算了每个部门内,按照工资排序的累计工资。

如何使用LAG() 和 LEAD() 函数?

LAG()

LEAD()

函数用于访问窗口内前一行或后一行的值。

LAG(column, n, default_value)

:返回窗口内当前行之前第 n 行的 column 值。如果之前没有 n 行,则返回 default_value。

LEAD(column, n, default_value)

:返回窗口内当前行之后第 n 行的 column 值。如果之后没有 n 行,则返回 default_value。

例如,要计算每个员工的工资与前一个员工的工资差:

SELECT    name,    department,    salary,    salary - LAG(salary, 1, 0) OVER (PARTITION BY department ORDER BY salary) AS salary_differenceFROM    employees;

结果如下:

name department salary salary_difference

AliceSales50005000EveSales5500500BobSales6000500CarolIT70007000DavidIT80001000

LAG(salary, 1, 0) OVER (PARTITION BY department ORDER BY salary)

返回了每个部门内,前一个员工的工资。第一个员工的工资差为 5000,因为

LAG()

函数返回了默认值 0。

FIRST_VALUE() 和 LAST_VALUE() 函数的应用场景

FIRST_VALUE()

LAST_VALUE()

函数用于返回窗口内第一行和最后一行的值。

FIRST_VALUE(column)

:返回窗口内第一行的 column 值。

LAST_VALUE(column)

:返回窗口内最后一行的 column 值。

需要注意的是,

LAST_VALUE()

函数默认只返回当前行及之前行的最后一行的值。如果需要返回整个窗口的最后一行的值,需要使用

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

子句。

例如,要计算每个员工的工资与部门最高工资的差:

SELECT    name,    department,    salary,    MAX(salary) OVER (PARTITION BY department) - salary AS salary_differenceFROM    employees;

或者使用

FIRST_VALUE()

LAST_VALUE()

函数:

SELECT    name,    department,    salary,    LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - salary AS salary_differenceFROM    employees;

这两个SQL语句的结果相同,都是计算每个员工的工资与部门最高工资的差。

如何使用NTILE()函数进行数据分桶?

NTILE(n)

函数将窗口内的数据分成 n 桶,并为每一行分配一个桶号。

例如,要将员工按照工资分成 3 个等级:

SELECT    name,    department,    salary,    NTILE(3) OVER (ORDER BY salary) AS salary_levelFROM    employees;

结果如下:

name department salary salary_level

AliceSales50001EveSales55001BobSales60002CarolIT70002DavidIT80003

NTILE(3) OVER (ORDER BY salary)

将员工按照工资排序,并分成 3 个等级。

窗口函数性能优化建议

窗口函数虽然强大,但使用不当也会影响性能。以下是一些性能优化建议:

尽量使用索引:

PARTITION BY

ORDER BY

子句中使用的列应该有索引,以提高查询效率。避免在窗口函数中使用复杂的表达式: 复杂的表达式会增加计算量,影响性能。合理选择窗口范围: 窗口范围过大或过小都会影响性能。应该根据实际需求选择合适的窗口范围。避免过度使用窗口函数: 过度使用窗口函数会增加查询复杂度,影响性能。

总之,窗口函数是MySQL中非常强大的数据分析工具。掌握窗口函数的使用,可以让你更轻松地完成各种复杂的数据分析任务。但同时也要注意性能优化,避免过度使用。

以上就是MySQL中常用的窗口函数有哪些 MySQL窗口函数详解与实战案例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1027733.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
天宫AI能做企业级应用吗_天宫AI企业解决方案与部署方法
上一篇 2025年12月2日 02:47:02
电脑程序里没有winrar怎么办_winrar软件安装与修复方法
下一篇 2025年12月2日 02:47:10

相关推荐

  • 探索VSCode Jupyter Notebook集成与扩展

    VSCode集成Jupyter Notebook提升开发效率,安装Jupyter扩展后可直接运行.ipynb文件,支持内核选择、Shift+Enter执行单元格、图表渲染及变量状态保留;结合Python扩展、Pylance、GitLens等工具,实现调试、智能提示、版本控制与代码转换,适合数据分析与…

    2026年9月24日
    000
  • Linux用户adduser与useradd命令区别

    adduser是交互式脚本,默认创建家目录并设密码,适用于Debian/Ubuntu;2. useradd是底层命令,需手动加参数创建家目录和Shell,通用性强,适合脚本使用。 在Linux系统中,adduser 和 useradd 都可以用来创建新用户,但它们在实现方式、使用习惯和功能上存在明显…

    2026年9月24日
    000
  • 如何在PHP的require语句中传递参数并有效管理变量作用域

    本文探讨了在php中使用`require`或`include`语句时如何向被引入文件传递参数。文章详细阐述了通过直接变量作用域共享、利用`$_get`超全局变量(不推荐)以及将引入文件内容封装为函数或类(推荐最佳实践)这三种方法,并提供了相应的代码示例,旨在帮助开发者理解和选择最适合其场景的参数传递…

    2026年9月24日
    000
  • 迅雷浏览器怎么开启深色模式_迅雷浏览器夜间模式设置

    开启迅雷浏览器深色模式可减少夜间用眼疲劳,具体方法包括:一、通过浏览器菜单进入设置,选择外观中的深色或夜间主题,或开启“跟随系统”选项实现自动切换;二、在操作系统中启用深色模式(Windows路径为“设置>个性化>颜色”,macOS为“系统设置>通用>外观”),并确保浏览器版本最新以兼容显示;三、若…

    2026年9月24日
    100
  • DeepArt的AI混合工具怎么操作?快速生成艺术风格图像的方法

    使用DeepArt类工具时,先选匹配的风格图与内容图,调节风格强度避免失真,推荐尝试Artbreeder、RunwayML、NightCafe等多元平台以提升创作效果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ DeepArt的AI混合…

    2026年9月24日
    000
  • windows11控制面板在哪里打开_windows11进入传统控制面板的办法

    windows11控制面板在哪里打开_windows11进入传统控制面板的办法windows11控制面板在哪里打开_windows11进入传统控制面板的办法windows11控制面板在哪里打开_windows11进入传统控制面板的办法windows11控制面板在哪里打开_windows11进入传统控制面板的办法

    1、通过Win+R输入control命令可快速打开控制面板;2、任务栏搜索“控制面板”并点击结果即可进入;3、开始菜单中展开“Windows 工具”文件夹可找到控制面板;4、文件资源管理器左侧导航栏下拉选择控制面板;5、桌面新建快捷方式输入explorer shell:ControlPanelFol…

    2026年9月24日 用户投稿
    200
  • 如何解决MySQL安装时配置不生效的处理方法?

    如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?

    配置mysql时遇到配置不生效的问题,常见原因包括配置文件路径错误、语法问题、命令行参数覆盖及数据目录权限或初始化问题。1. 配置文件路径是否正确?mysql只会读取特定路径的配置文件,建议使用命令mysql –help | grep “default options&#82…

    2026年9月24日 用户投稿
    000
  • 三星S系列手机微信收款语音播报怎么开启?配置语音的详细方法

    要开启三星S系列微信收款语音播报,需先在微信“收付款”中开启“收款到账语音提醒”,再确保手机通知权限开启、媒体音量正常,并将微信设为电池不优化应用。 三星S系列手机要开启微信收款语音播报,核心步骤其实不复杂:首先要在微信应用内部找到并激活“收款到账语音提醒”功能,同时,非常关键的一点是,确保你的三星…

    2026年9月24日
    100
  • Laravel Livewire 使用指南:构建交互式论坛的最佳实践

    本文旨在指导开发者如何在现有的 Laravel 项目中集成 Livewire,并以构建论坛为例,探讨 Livewire 组件的最佳使用方式和命名规范。文章将深入分析全页面组件和独立组件的选择,并提供实用的代码示例和建议,帮助开发者在保证项目结构清晰的前提下,充分利用 Livewire 的优势,构建高…

    2026年9月24日
    100
  • VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧VSCode如何实现代码自动修复 VSCode智能重构与错误修正技巧

    vscode通过集成语言服务协议(lsp)、内置quick fixes和refactoring actions,并结合扩展如eslint、prettier等,实现代码自动修复与智能重构;2. 启用editor.formatonsave和editor.codeactionsonsave设置可在保存时自…

    2026年9月24日 用户投稿
    100
  • Pages如何协作修改文档 Pages跟踪修改和建议的用法

    使用Pages的协作与修订功能可高效编辑文档,先启用共享邀请协作者,再通过建议模式提出修改,所有更改以标记形式显示,经审查后接受或拒绝,最终关闭修订模式保存定稿。 如果您正在与团队成员共同编辑一份文档,但希望保留原始内容并记录所有更改建议,可以使用 Pages 的协作与修订功能来实现高效沟通。通过这…

    2026年9月24日
    100
  • Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪

    Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪

    Polarr的AI裁剪通过内容感知智能识别主体与构图焦点,提供如主体居中、构图优化和比例推荐等方案,操作上先导入图片,选择裁剪工具后AI即分析画面并生成多个推荐预设,用户可直接应用或手动微调,相比传统裁剪显著提升效率、辅助构图决策,尤其适用于社交媒体多平台比例适配,帮助保持视觉一致性并避免关键信息被…

    2026年9月24日 用户投稿
    600
  • VSCode如何运行终端命令 VSCode内置终端的使用指南

    在VSCode里运行终端命令,最直接、最核心的方式就是利用它内置的集成终端。这玩意儿简直是开发者工作流的“心脏”,你可以在不离开编辑器界面的情况下,直接敲入并执行各种命令行操作,无论是跑测试、安装依赖,还是启动项目,都方便得要命。它把代码编辑和命令执行无缝衔接起来,大大减少了上下文切换的开销。 解决…

    2026年9月24日
    200
  • qq浏览器怎么看3d网页效果_QQ浏览器体验WebGL 3D网页效果指南

    首先启用QQ浏览器的高速渲染组件并确保其已安装开启,然后将页面切换至极速模式以支持WebGL,接着更新显卡驱动以保障图形渲染正常,最后清除浏览器缓存与重置设置排除故障,按此步骤可解决3D网页黑屏、白屏问题。 如果您尝试在QQ浏览器中查看3D网页效果,但页面无法正常显示或出现黑屏、白屏,可能是由于浏览…

    2026年9月24日
    100
  • 前端的设计模式系列-基本原则

    在完成对二十三个经典设计模式的讲解后,我们再来回顾一下一些基本原则,以便在日常开发中更好地理解和应用这些概念。 单一职责原则(SRP,Single Responsibility Principle)定义:一个类或模块应该有且仅有一个改变的原因。在 JavaScript 中,这更多地应用于对象和函数。…

    2026年9月24日
    200
  • mysql如何优化表结构?表结构设计方法

    设计和优化 mysql 表结构应从字段类型选择、主键与索引设计、冗余与范式处理、分表分区策略四个方面入手。1. 合理选择字段类型,如整数用 int/bigint,枚举值用 enum 或 tinyint,日期用 datetime,避免过度使用 text/blob;2. 主键建议使用自增整型,避免长字段…

    2026年9月24日
    1000
  • 一加Pro系列应用无法卸载怎么办?教你绕过限制删除应用

    若一加Pro系列手机应用无法卸载,首先检查是否具备设备管理权限,进入设置-安全与隐私-设备管理应用,取消激活后即可卸载;若为预装应用,可通过应用管理禁用;对于顽固应用,可使用ADB命令强制卸载,需启用USB调试并执行pm uninstall命令;若应用锁定进程,可重启至安全模式后卸载。 如果您尝试从…

    2026年9月24日
    100
  • VSCode 怎样设置文件的自动命名规则 VSCode 文件自动命名规则的设置技巧​

    vscode 本身不提供图形界面设置文件自动命名,但可通过配置 emmet.variables 和使用插件实现;2. 可在 settings.json 中添加如 “emmet.variables”: { “today”: “${tm_yea…

    2026年9月24日
    100
  • Pages怎么进行邮件合并 Pages批量生成信函的实用功能

    使用Pages邮件合并功能可批量生成个性化文档。首先准备通讯录或Numbers表格形式的联系人列表,确保信息完整、格式清晰;接着在Pages中创建主文档模板,输入通用内容并通过“链接到联系人”插入动态字段;然后在“设置”中启用“邮件合并”,选择数据源并确认字段映射正确;最后导出为单个文件或批量生成P…

    2026年9月24日
    200
  • 有选择性地移除 WooCommerce 订单邮件中的产品购买备注

    本文将指导您如何针对特定的 WooCommerce 订单邮件通知,有选择性地移除产品购买备注,避免在所有邮件中都隐藏该信息。 使用 WooCommerce 钩子和全局变量进行控制 WooCommerce 允许开发者通过钩子(hooks)修改其核心功能。为了实现我们的目标,我们需要使用 woocomm…

    2026年9月24日
    300

发表回复

登录后才能评论
关注微信