mysql窗口函数
排序窗口函数
ROW_NUMBER()
行号:不重复、不并列,哪怕值相同,也依次 1、2、3、4
例:90000 (1)、85000 (2)、85000 (3)、70000 (4)
RANK()
排名:并列会跳号
例:90000 (1)、85000 (2)、85000 (2)、70000 (4)
DENSE_RANK()
密集排名:并列不跳号
例:90000 (1)、85000 (2)、85000 (2)、70000 (3)
聚合窗口函数(搭配 OVER() 的 SUM、AVG、COUNT等)
普通的 SUM() 是“榨汁机”(多行变一行);但带上 OVER() 后,它变成了“标签机”(行数不变,在旁边加一列累计值)。
-
SUM(列) OVER():累计求和 -
AVG(列) OVER():移动平均 -
COUNT(列) OVER():累计计数
偏移分析窗口函数(LAG 和 LEAD)—— 对比“上一条/下一条”
专门用来和表格里的上一行或下一行做对比(比如算环比增长率)。
-
LAG(列, 偏移量, 默认值):向上取第 N 行的值(看前一条) -
LEAD(列, 偏移量, 默认值):向下取第 N 行的值(看后一条)
首尾取值窗口函数(FIRST_VALUE 和 LAST_VALUE)
-
FIRST_VALUE(列):取分组内第一个值 -
LAST_VALUE(列):取分组内最后一个值(需配合特定窗口边界)
窗口函数的通用语法骨架
函数名(列) OVER(
[PARTITION BY 分组列1, 分组列2 ...] -- 不写就等于全表一组
[ORDER BY 排序列 ASC|DESC] -- 决定窗口内如何排序
[ROWS/RANGE 窗口范围] -- 指定滑动窗口大小(默认是截至当前行)
)
拆解理解:
-
PARTITION BY= 相当于“轻量级的 GROUP BY”,只负责把数据切成若干小组,不会压缩行数。 -
ORDER BY= 决定在小组内,数据如何从前到后排列(计算排名、累计时必须写)。 -
ROWS/RANGE= 定义窗口的“滑动范围”(例如ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING表示取当前行的前一行、后一行和自己,共3行做计算)。
浙公网安备 33010602011771号