MySQL 8 窗口函数

窗口函数是 MySQL 8 才有的能力,它能在不合并行的前提下,给每一行算一个『同组排名』或『累计值』。做排行榜、取每组前 N 条、算环比,用它比子查询清爽太多。

MySQL 8 窗口函数要点

MySQL 8 窗口函数示例

						-- 每个用户的订单按金额排名
						SELECT user_id, order_id, amount,
						       RANK() OVER (PARTITION BY user_id ORDER BY amount DESC) AS rk
						FROM orders;

						-- 按时间累计成交额
						SELECT order_id, created_at, amount,
						       SUM(amount) OVER (ORDER BY created_at) AS running_total
						FROM orders;

						-- 取每类商品销量前 3
						SELECT * FROM (
						  SELECT product_id, sales,
						         ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) AS rn
						  FROM product
						) t WHERE rn ≤ 3;
避坑提醒:ROW_NUMBER 和 RANK 都会因 ORDER BY 相同值产生并列,但结果不同:要『严格不重复序号』用 ROW_NUMBER,要『名次可并列且跳号』才用 RANK。
MySQL 8 窗口函数 · MySQL 函数 知识卡片
卡片 10 / 11 · MySQL 函数(1080×1440 速查卡片)

MySQL 函数知识点