mysql开窗函数, MySQL 8.0 及以上版本引入的强大功能

首页 2025-10-11 16:34:02


MySQL 开窗函数(Window Functions)是 MySQL 8.0 及以上版本引入的强大功能,用于在一组表行上执行计算,类似于聚合函数,但不会将多行合并为一行,而是为每行返回一个结果。
开窗函数的基本语法:
sql
函数名(参数) OVER (
    [PARTITION BY 分区列]  -- 按指定列分组
    [ORDER BY 排序列 [ASC|DESC]]  -- 组内排序
    [ROWS|RANGE BETWEEN 边界规则]  -- 窗口范围(可选)
)
 

常用开窗函数分类

  1. 排名函数
    • ROW_NUMBER():为每行分配唯一序号,即使值相同也不会重复
    • RANK():相同值会有相同排名,下一名会跳过间隔
    • DENSE_RANK():相同值会有相同排名,下一名不会跳过间隔
    示例:
    sql
    SELECT 
      name, score,
      ROW_NUMBER() OVER (ORDER BY score DESC) AS rn,
      RANK() OVER (ORDER BY score DESC) AS rk,
      DENSE_RANK() OVER (ORDER BY score DESC) AS dr
    FROM students;
    
     
     
  2. 聚合函数作为开窗函数
    • SUM()AVG()COUNT()MAX()MIN() 等
    示例:
    sql
    -- 计算每个部门员工的工资及部门平均工资
    SELECT 
      dept, name, salary,
      AVG(salary) OVER (PARTITION BY dept) AS dept_avg_salary
    FROM employees;
    
     
     
  3. 分布函数
    • PERCENT_RANK():计算百分比排名
    • CUME_DIST():计算累积分布值
  4. 前后函数
    • LAG(expr, n):获取当前行的前 n 行数据
    • LEAD(expr, n):获取当前行的后 n 行数据
    示例:
    sql
    -- 获取每个员工的上一个和下一个员工的工资
    SELECT 
      name, salary,
      LAG(salary, 1) OVER (ORDER BY salary) AS prev_salary,
      LEAD(salary, 1) OVER (ORDER BY salary) AS next_salary
    FROM employees;
    
     
     

窗口范围指定

可以通过 ROWS 或 RANGE 定义窗口的具体范围:
sql
-- 计算包括当前行和前两行的移动平均值
SELECT 
  date, value,
  AVG(value) OVER (
    ORDER BY date 
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS moving_avg
FROM metrics;
 

注意事项

  • 开窗函数只能用于 SELECT 子句和 ORDER BY 子句
  • PARTITION BY 子句可选,不指定则对整个结果集进行计算
  • MySQL 8.0 及以上版本才支持开窗函数
开窗函数特别适合解决排名、Top N、移动平均值、累计求和等复杂分析场景,能够大大简化这类问题的 SQL 编写。
 
 

nat123映射怎么用?超详细步骤,外网访问内网轻松搞定
nat123域名怎么用?两种方式轻松搞定
nat123怎么用?简单几步实现内网穿透
内网穿透工具对比:nat123、花生壳与轻量新选择
远程访问内网很简单:用对工具,一“箭”穿透
ngrok下载完全指南:从入门到获取客户端
内网远程桌面软件:穿透局域网边界的数字窗口
从外网远程访问内网服务器的完整方案
Windows Server 2008端口转发完全教程:netsh命令添加/查看/删除/重置
为什么三层交换机转发比Linux服务器快?转发表硬件加速的秘密