AVG OVER 窗口函数详解
一、一句话理解
AVG() OVER() 计算每个窗口范围内的平均值,最常用于 7 日均线、移动平均等场景。
二、函数语法
AVG(列名) OVER (PARTITION BY 分组列 ORDER BY 排序列 窗口帧)
三、真实业务场景
场景:股票 7 日移动均线
计算每天收盘价及过去 7 天(含当天)的均价。
SELECT trade_date, close_price,
AVG(close_price) OVER (ORDER BY trade_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma_7
FROM stock_price;
示例数据与结果:
+------------+-------------+-------+
| trade_date | close_price | ma_7 |
+------------+-------------+-------+
| 2025-01-02 | 10.0 | 10.0 |
| 2025-01-03 | 10.5 | 10.3 |
| 2025-01-04 | 11.0 | 10.5 |
| ... | ... | ... |
| 2025-01-10 | 10.8 | 10.6 | ← 7日均线
+------------+-------------+-------+
四、与 SUM OVER 的关系
移动平均 = 移动求和 / 行数。实际上 AVG OVER 就是 SUM OVER / COUNT OVER 的简写。但直接用 AVG 更简洁,也避免了手动除法产生的精度问题。
五、常见坑点
坑1:前面几行的窗口不完整
前 6 天的窗口不足 7 行,AVG 仍然计算(比如第 2 天只有 2 行数据)。如果要求严格 7 天均值,需要 COUNT(*) OVER (...) 作判断。
坑2:NULL 值处理
AVG 自动跳过 NULL。如果某天 close_price 为 NULL,该行不计入窗口内行数,也不计入均值的分母。如果需要包含 NULL 行,用 COALESCE(close_price, 0)。
六、面试怎么考
- "怎么算 7 日移动平均?" → AVG OVER + ROWS 6 PRECEDING
- "移动平均和普通 AVG 的区别?" → 窗口帧的区别
- "前几天的均线为什么不准?" → 窗口不完整
七、相关面试题
- 05. 供应链库存周转天数计算 — AVG 聚合统计
- 03. 物流时效统计 — AVG 平均耗时
- 01. 车辆日均行驶里程统计 — AVG + GROUP BY
- 更多窗口函数面试题 →
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
