首页/数据/数据库速查/窗口函数:ROW_NUMBER / RANK / SUM OVER(8.0)
本包目录(495 条)
MySQL 基础与连接36 条
SQL 语法52 条
用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条Redis 运维与场景124 条

窗口函数:ROW_NUMBER / RANK / SUM OVER(8.0)

在结果集上做排名、累计与移动聚合而不折叠行;比自连接写法更清晰也更快,是 8.0 升级的重要理由。

数据库速查数据更新于 2026-10-12
用途排名与窗口聚合
常用ROW_NUMBER() RANK() DENSE_RANK() LAG() LEAD() SUM() OVER()
结构OVER(PARTITION BY … ORDER BY …)

按用户取最新一单

按用户取最新一单
SELECT * FROM (
  SELECT o.*, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
  FROM orders o
) t WHERE rn = 1;

累计金额与环比

累计金额与环比
SELECT id, amount,
  SUM(amount) OVER (ORDER BY id) AS cum_amount,
  LAG(amount) OVER (ORDER BY id) AS prev_amount
FROM orders;
窗口函数不能写在 WHERE 里,需要外层子查询过滤排名(rn=1)或用 QUALIFY 类改写。

易错点

  • ROW_NUMBER 与 RANK 在并列值上行为不同:前者不重复、后者并列跳号
  • 8.0 以下没有窗口函数,语法会直接报错,确认版本再用

数据来源与参考

  • MySQL 8.0 Reference Manual: Window Functions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌