Mysql 8.0窗口函数1.0
<窗口函数名>([参数]) OVER (
[PARTITION BY 列名] -- 分区:把数据划分成多个窗口(类似group by)
[ORDER BY 列名] -- 窗口内排序
[ROWS/RANGE 子句] -- 窗口框架:限定分区内参与计算的行范围(默认RANGE)
)
- OVER():窗口定义,是窗口函数的标志。
- PARTITION BY:分区(分组),相当于 group by,但不合并行;省略则整个结果集为一个分区。
- ORDER BY:分区内排序,很多排名函数必须写 order by。
- ROWS / RANGE:帧(frame),在分区内划定一个滑动子集,默认:
- 当有
ORDER BY:RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - 无
ORDER BY:RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
- 当有
ROWS:按物理行数划定窗口
RANGE:按值范围划定窗口(对日期、数字)
| 帧关键字 | 含义 |
| ------------------- | --------- |
| UNBOUNDED PRECEDING | 分区第一行 |
| N PRECEDING | 当前行往前 N 行 |
| CURRENT ROW | 当前行 |
| N FOLLOWING | 当前行往后 N 行 |
| UNBOUNDED FOLLOWING | 分区最后一行 |
窗口函数名:
- 排名类:
ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE() - 聚合类窗口函数:
SUM()、AVG()、MAX()、MIN()、COUNT()后面加OVER() - 取值类:
LAG()、LEAD()、FIRST_VALUE()、LAST_VALUE()、NTH_VALUE()
1. ROW_NUMBER()
连续编号,即使值相同,编号也不重复
SELECT
dept,name,sale,
ROW_NUMBER() OVER(PARTITION BY dept ORDER BY sale DESC) AS rn
FROM sales;
2. RANK()
相同值排名相同,后续序号会跳过(有间隙排名)
李四、王五都是第 2 名,下一个直接是第 4 名
RANK() OVER(PARTITION BY dept ORDER BY sale DESC) AS rk
3. DENSE_RANK()
相同值排名相同,序号不跳过,连续排名(无间隙)
李四、王五都是第 2 名,下一个是第 3 名
DENSE_RANK() OVER(PARTITION BY dept ORDER BY sale DESC) AS dr

浙公网安备 33010602011771号