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行做计算)。

 

posted @ 2026-07-11 11:32  雨花阁  阅读(4)  评论(0)    收藏  举报