news 2026/7/22 0:49:48

sql窗口函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 是聚合分组,每组只返回一行结果;窗口函数是开窗计算,会保留所有行,同时附加计算结果。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 13:28:42

欧姆龙与发那科机器人通信程序那些事儿

欧姆龙 发那科 机器人 通信程序 CP1H EIP21 与FANUC通信 Ethernet/IP 已经做在功能块里&#xff0c;配置一下起始值结束值&#xff0c;节点就能连接成功。 例如连接了R1至R5在PLC中D1至D5 数值可以在机器人改也可以在PLC改&#xff0c;可以一个一个改也可以批量改。 本功能块逻…

作者头像 李华
网站建设 2026/7/14 20:00:47

经典 37kw 永磁同步电机设计案例分享

经典37kw&#xff0c;3000RPM&#xff0c;112Nm, 6极36槽永磁同步电机&#xff08;PMSM&#xff09;设计案例(V型磁钢)&#xff0c;该案例已制作样机&#xff0c;方案成熟&#xff0c;运行稳定&#xff0c;具有全套图纸&#xff0c;(图纸另外计算)可直接用于生产&#xff0c;齿…

作者头像 李华
网站建设 2026/7/21 17:36:19

Vue3-013 watch监视 ref 定义的数据

文章目录watch 作用watch 情况一&#xff1a;ref 定义的数据问题&#xff1a;为什么这里再次调用就停止这个函数了?箭头函数watch 情况二&#xff1a;ref 定义的对象数据watch 作用 watch 监视数据的变化&#xff0c;写法vue2与vue3中不同 watch 情况一&#xff1a;ref 定…

作者头像 李华
网站建设 2026/7/14 7:40:18

【dz-1010】基于单片机的药品生产车间环境监测

摘要 随着医药行业的严格规范&#xff0c;药品生产车间的环境参数对药品质量与生产安全至关重要。传统车间环境监测依赖人工巡检和手动记录&#xff0c;存在数据滞后、调控不及时、误差较大等问题&#xff0c;难以满足药品生产的高标准要求。 基于 STM32F103C8T6 单片机的药品…

作者头像 李华
网站建设 2026/7/18 2:11:27

合规领航:下一代数字资产交易所全栈架构设计“黄金法则”大公开

引言&#xff1a;数字资产交易所的“合规突围战”在数字货币狂潮席卷全球的当下&#xff0c;数字资产交易所作为这场金融变革的核心枢纽&#xff0c;正经历着前所未有的挑战与机遇。据统计&#xff0c;全球数字资产交易所数量已突破千家&#xff0c;日交易量峰值超千亿美元&…

作者头像 李华