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

sql窗口函数

mysql窗口函数:告别繁琐子查询

在处理排名统计、分组内对比、累计计算这类需求时,你是不是还在写多层子查询、反复关联表?mysql窗口函数就是为解决这类问题而生的高效工具——它能在不聚合数据的前提下,对指定数据集(窗口)内的行做计算,让代码更简洁、性能更优。

窗口函数的核心语法:

<函数名>([expr]) over(

[partition by <列名>]

[order by <列名> [asc|desc]]

[rows|range <窗口范围>]

)

- partition by:可选,按指定列分组,每组是一个独立窗口,不分组则整个结果集为一个窗口。

- order by:可选,定义窗口内数据的排序规则,决定排名、累计等计算的顺序。

- rows|range:可选,限定窗口内的行范围,比如“当前行的前2行到后1行”。

mysql窗口函数主要分三类,日常开发够用了:

1. 排名函数: rank() 、 dense_rank() 、 row_number()

三者的核心区别在于处理并列排名的方式:

- row_number() :不管是否并列,都生成连续序号(1,2,3,4)。

- rank() :并列会跳过后续序号(1,2,2,4)。

- dense_rank() :并列不跳过序号(1,2,2,3)。

举个例子,统计每个部门员工的薪资排名:

select

dept, name, salary,

row_number() over(partition by dept order by salary desc) as rn,

rank() over(partition by dept order by salary desc) as rk,

dense_rank() over(partition by dept order by salary desc) as dr

from emp;

2. 聚合窗口函数: sum() 、 avg() 、 max() 、 min()

和普通聚合函数的区别是,它不会将多行合并为一行,而是保留每行数据,同时计算窗口内的聚合结果。

比如计算每个员工的薪资,以及其所在部门的平均薪资:

select

dept, name, salary,

avg(salary) over(partition by dept) as dept_avg_sal

from emp;

3. 取值函数: lag() 、 lead() 、 first_value() 、 last_value()

用于获取窗口内指定位置的行数据,解决“和上一条/下一条数据对比”的需求。

- lag(expr, n) :获取当前行的前n行的expr值。

- lead(expr, n) :获取当前行的后n行的expr值。

比如查看每个员工的薪资,以及上一位员工的薪资:

select

name, salary,

lag(salary, 1) over(order by salary) as prev_sal

from emp;

最后说个关键:窗口函数和 group by 的区别。 group by 是聚合分组,每组只返回一行结果;窗口函数是开窗计算,会保留所有行,同时附加计算结果。

窗口函数: 用更少的代码、更高的效率,搞定那些之前需要绕弯子的统计需求

http://www.jsqmd.com/news/268699/

相关文章:

  • SSCOM:硬件通信调试领域的多理论融合实践
  • 开源APS排产系统,出货计划如何成为企业降本增效的关键?
  • 多个企业如何显示在同一张GRS证书上
  • 2026年打包机怎么选?揭秘优质封箱打包机厂家,折盖封箱机/胶带封箱机/自动封箱机/纸箱码垛机,打包机源头厂家推荐 - 品牌推荐师
  • GEO 系统开发哪家强?全域流量优化指南
  • 工程师招聘综合:BOSMA博冠在招岗位
  • 《深入 Python 序列化世界:msgpack vs pickle 的本质区别与安全真相》
  • MATLAB图像增强:开启视觉盛宴之旅
  • Vuex持久化方案:避免刷新页面数据丢失
  • 深入解析MySQL9主从复制架构详解从原理到实战
  • 经典 37kw 永磁同步电机设计案例分享
  • ACPI!PciConfigSpaceHandler到ACPI!PciConfigSpaceHandlerWorker到ACPI!GetPciAddress
  • Pinia vs Vuex:如何选择?
  • Windows正测试新版运行对话框设计,附启用方法
  • SpringMVC深度解析从基础架构到实战应用的全方位指南
  • 《从字节到速度:手撕一个零拷贝二进制协议(struct + buffer protocol 深度实战)》
  • 好用的问卷调查平台测评:随机抽题+360度评估全功能解析 - 品牌排行榜
  • ACPI!GetPciAddress到ACPI!GetPciAddressWorker完成后会调用state->CompletionRoutine:ACPI!PciConfigSpaceHandler
  • 解决精密装配难题:这家值得推荐的电爪品牌以高精度和可靠性脱颖而出 - 品牌2025
  • 在组件外使用Vuex的几种方法
  • 2026/1/19
  • 降本增效:XinServer 如何帮助全栈工程师加速项目上线?
  • Hugging Face 命令失效问题解析: huggingface-cli: command not found -问题解决有效方案
  • 2026 十大图库推荐:自媒体、小红书、公众号配图素材网站盘点 - 品牌2025
  • 盲盒经济持续升温,如何解锁消费新场景?
  • 【dz-1012】小型无士栽培自动控制系统设计与实现
  • 2026年十字传动轴市场,口碑厂家大盘点,球齿传动轴/联轴器/传动轴/球齿联轴器/齿式联轴器,十字传动轴企业推荐排行榜 - 品牌推荐师
  • gitlab-ce 的简单使用
  • Springboot小树立社工服务中心管理信息系统9mpe3(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 写这个方法的人真是个不折不扣的大SB_Ruoyi