跳到主要内容

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 的区别?" → 窗口帧的区别
  • "前几天的均线为什么不准?" → 窗口不完整

七、相关面试题

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

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

交流微信二维码

你可能还想看