2026/5/24 5:48:15
网站建设
项目流程
律师怎么做网站,seo快速优化技术,安康网站建设公司电话,网站方案建设书模板mysql窗口函数#xff1a;告别繁琐子查询在处理排名统计、分组内对比、累计计算这类需求时#xff0c;你是不是还在写多层子查询、反复关联表#xff1f;mysql窗口函数就是为解决这类问题而生的高效工具——它能在不聚合数据的前提下#xff0c;对指定数据集#xff08;窗…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。举个例子统计每个部门员工的薪资排名selectdept, 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 drfrom emp;2. 聚合窗口函数 sum() 、 avg() 、 max() 、 min()和普通聚合函数的区别是它不会将多行合并为一行而是保留每行数据同时计算窗口内的聚合结果。比如计算每个员工的薪资以及其所在部门的平均薪资selectdept, name, salary,avg(salary) over(partition by dept) as dept_avg_salfrom emp;3. 取值函数 lag() 、 lead() 、 first_value() 、 last_value()用于获取窗口内指定位置的行数据解决“和上一条/下一条数据对比”的需求。- lag(expr, n) 获取当前行的前n行的expr值。- lead(expr, n) 获取当前行的后n行的expr值。比如查看每个员工的薪资以及上一位员工的薪资selectname, salary,lag(salary, 1) over(order by salary) as prev_salfrom emp;最后说个关键窗口函数和 group by 的区别。 group by 是聚合分组每组只返回一行结果窗口函数是开窗计算会保留所有行同时附加计算结果。窗口函数: 用更少的代码、更高的效率搞定那些之前需要绕弯子的统计需求