Mysql 8.0窗口函数1.0

<窗口函数名>([参数]) OVER (
[PARTITION BY 列名] -- 分区:把数据划分成多个窗口(类似group by)
[ORDER BY 列名] -- 窗口内排序
[ROWS/RANGE 子句] -- 窗口框架:限定分区内参与计算的行范围(默认RANGE)
)

  1. OVER():窗口定义,是窗口函数的标志。
  2. PARTITION BY:分区(分组),相当于 group by,但不合并行;省略则整个结果集为一个分区。
  3. ORDER BY:分区内排序,很多排名函数必须写 order by。
  4. 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 | 分区最后一行 |

窗口函数名:

  1. 排名类:ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE()
  2. 聚合类窗口函数:SUM()、AVG()、MAX()、MIN()、COUNT() 后面加 OVER()
  3. 取值类: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

posted @ 2026-10-13 10:04  iUv~  阅读(10)  评论(0)    收藏  举报