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 编写。
 
 

MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道