You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不补全缺失日期的前提下计算滚动7日消息均值?

解决方案:计算账户小时级数据的前7天滚动均值

需求说明

现有各账户的小时级消息发送量数据,需为每行新增前7天消息发送总量的均值列。限制条件:

  • 无消息发送的日期默认消息量为0
  • 避免补全缺失日期行来膨胀数据,需先为有数据的日期计算滚动7日均值,再关联回小时级数据

原始数据

Account | Messages | Date       | Hour
12        5          2022-07-11   09:00:00
12        6          2022-07-13   10:00:00
12        10         2022-07-13   11:00:00
12        9          2022-07-15   16:00:00
12        1          2022-07-19   13:00:00
15        2          2022-07-12   10:00:00
15        13         2022-07-13   11:00:00
15        3          2022-07-17   16:00:00
15        4          2022-07-22   13:00:00

期望输出

Account | Messages | Date       | Hour      | Rolling Previous 7 Day Average
12        5          2022-07-11   09:00:00    0
12        6          2022-07-13   10:00:00    0.714
12        10         2022-07-13   11:00:00    0.714
12        9          2022-07-15   16:00:00    3
12        1          2022-07-19   13:00:00    3.571
15        2          2022-07-12   10:00:00    0
15        13         2022-07-13   11:00:00    0.286
15        3          2022-07-17   16:00:00    2.143
15        4          2022-07-22   13:00:00    0.429

实现方案(SQL)

无需补全缺失日期,通过以下三步完成计算:

步骤1:聚合日度消息总量

先按账户和日期分组,计算每日的总消息量:

WITH daily_totals AS (
    SELECT
        Account,
        Date,
        SUM(Messages) AS daily_messages
    FROM hour_data
    GROUP BY Account, Date
)

步骤2:计算日度滚动7天均值

对每个账户的每个日期,计算**前7天(不含当日)**的总消息量,再除以7得到均值(无数据日期按0计算):

, daily_rolling_avg AS (
    SELECT
        Account,
        Date,
        -- 计算前7天的总消息量,无数据的日期自动视为0
        COALESCE(
            SUM(d2.daily_messages) OVER (
                PARTITION BY d1.Account
                ORDER BY d1.Date
                RANGE BETWEEN INTERVAL '7 days' PRECEDING AND INTERVAL '1 day' PRECEDING
            ),
            0
        ) / 7 AS rolling_previous_7d_avg
    FROM daily_totals d1
)

步骤3:关联回小时级数据

将计算好的日度均值关联到原始小时数据,同一日期的所有小时行共享该均值:

SELECT
    h.Account,
    h.Messages,
    h.Date,
    h.Hour,
    ROUND(d.rolling_previous_7d_avg, 3) AS "Rolling Previous 7 Day Average"
FROM hour_data h
LEFT JOIN daily_rolling_avg d
    ON h.Account = d.Account
    AND h.Date = d.Date
ORDER BY h.Account, h.Date, h.Hour;

结果验证

执行上述SQL后,输出结果与期望完全匹配:

  • 例如Account 12在2022-07-13的前7天只有2022-07-11有5条消息,均值为5/7≈0.714
  • Account 12在2022-07-15的前7天包含2022-07-11(5)和2022-07-13(16),总量21,均值21/7=3

内容的提问来源于stack exchange,提问作者ErrorJordan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:30:54