别再死记 SQL 了:一条示例看懂 OVER 窗口函数到底在算什么
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
很多人第一次接触
SQL 能写出来,但一旦结果不对,就开始怀疑人生。 问题通常不在 SQL 技巧,而在于—— 这篇文章,我们只用一套极简、脱敏、为讲解而设计的 SQL,把 一、一个刻意简化的业务场景假设有一张订单表,记录每天产生的订单金额:
我们要做的统计是:
注意这个关键词: 二、第一步:只算“每个月新增”(不用 OVER)先把“每个月新增金额”算清楚。
这一步做的事情非常纯粹:
结果类似:
三、问题来了:怎么得到“截至当月的累计值”?很多人第一反应是:
答案是:不行。
而“累计”这件事,本质是:
这正是窗口函数存在的意义。 四、OVER 的登场:窗口是怎么“打开”的我们把上一步的结果作为一个“月度数据集”,再加一层查询:
这条 SQL 就是理解 五、一句一句拆解 OVER 在干什么1️⃣ |
| month_time | month_amount |
|---|---|
| 2025-01 | 10000 |
| 2025-02 | 15000 |
| 2025-03 | 12000 |
窗口函数在每一行看到的数据是:
2025-01
窗口 = [2025-01]
累计 = 10000
2025-02
窗口 = [2025-01 → 2025-02]
累计 = 25000
2025-03
窗口 = [2025-01 → 2025-03]
累计 = 37000
这就是“窗口在时间轴上向后滑动”的真实含义。
很多人会把两者混在一起,这里给一个清晰对照:
| 维度 | GROUP BY | OVER |
|---|---|---|
| 是否合并行 | 是 | 否 |
| 是否保留明细 | 否 | 是 |
| 是否能做累计 | 否 | 是 |
| 是否依赖顺序 | 否 | 是 |
一句话总结:
GROUP BY 改变结果集结构,OVER 只改变每一行“看到的数据范围”。
如果你把窗口范围改成:
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
含义立刻变成:
近 3 个月的滚动总额
你会发现:
SQL 完全没变,变的只是“窗口大小”。
这也是窗口函数被称为“分析型 SQL”的原因。
关于 OVER,只需要记住三句话:
它不是用来分组的,而是用来定义“视角”的
ORDER BY 决定时间或逻辑方向
ROWS BETWEEN 决定你能看到多远的历史
当你真正理解了“窗口在滑动”,
累计、排名、同比、环比,本质上都是同一套机制的不同表达。