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

Redshift SQL按固定30天窗口滚动求和全年访问量方案咨询

Redshift 30天周期访问量汇总实现方案

核心逻辑

以2021-01-28为首个周期起始日,计算每条日数据距离起始日的天数差,每30天划分为一个周期,共取12个周期后分组汇总访问量即可。

基础实现(无空周期补0)

假设你的日粒度统计表名为daily_views,包含date(日期类型)、views(数值类型)两个字段,直接执行以下SQL:

WITH period_tag AS (
    SELECT
        views,
        -- 计算周期序号,从1开始计数
        FLOOR(DATEDIFF(day, '2021-01-28'::DATE, date) / 30) + 1 AS series
    FROM daily_views
    -- 过滤12个周期覆盖的日期范围,排除无效数据
    WHERE date >= '2021-01-28'::DATE
      AND date < DATEADD(day, 30 * 12, '2021-01-28'::DATE)
)
SELECT
    series,
    SUM(views) AS views
FROM period_tag
GROUP BY series
ORDER BY series;

扩展实现(空周期补0)

如果需要保留没有访问数据的周期,显示访问量为0,先生成1-12的连续周期序列再关联统计结果:

WITH -- 生成1-12连续周期序号
all_series AS (
    SELECT generate_series(1, 12) AS series
),
period_stats AS (
    SELECT
        FLOOR(DATEDIFF(day, '2021-01-28'::DATE, date) / 30) + 1 AS series,
        SUM(views) AS views
    FROM daily_views
    WHERE date >= '2021-01-28'::DATE
      AND date < DATEADD(day, 360, '2021-01-28'::DATE)
    GROUP BY series
)
SELECT
    a.series,
    COALESCE(p.views, 0) AS views
FROM all_series a
LEFT JOIN period_stats p ON a.series = p.series
ORDER BY a.series;

可选补充(展示周期起止日期)

如果需要在结果中明确每个周期的时间范围,在输出字段中添加周期起止计算逻辑即可:

WITH period_tag AS (
    SELECT
        views,
        FLOOR(DATEDIFF(day, '2021-01-28'::DATE, date) / 30) + 1 AS series
    FROM daily_views
    WHERE date >= '2021-01-28'::DATE
      AND date < DATEADD(day, 360, '2021-01-28'::DATE)
)
SELECT
    series,
    DATEADD(day, (series - 1) * 30, '2021-01-28'::DATE) AS period_start,
    DATEADD(day, series * 30 - 1, '2021-01-28'::DATE) AS period_end,
    SUM(views) AS views
FROM period_tag
GROUP BY series
ORDER BY series;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:15:03