首页 > 解决方案 > 使用数据中的间隙运行 Sum

问题描述

我有一个关于分区运行总和的查询。它获取当前行和下面 3 行的数据集的 4 周运行总和。我的问题是数据集有差距,并且数据中没有所有星期,这导致我的运行总和不正确。我可以使用 SQL 来填写缺少的周数,以便我的 4 周运行总和准确。在下面的示例中,缺少 26/10 和 2/11 的数据,因此我未来 4 周的运行总和不准确

样本数据

Item_No Week_Starting_Monday    Cover_Weeks Four_Weeks_Cover
6-KDDDORF   20201012    3   8
6-KDDDORF   20201019    2  9
6-KDDDORF   20201109    1   12
6-KDDDORF   20201116    2   11
6-KDDDORF   20201123    4   9
6-KDDDORF   20201130    5   5

所需数据

Item_No Week_Starting_Monday    Cover_Weeks Four_Weeks_Cover
6-KDDDORF   20201012    3   5
6-KDDDORF   20201019    2   3
6-KDDDORF   20201109    1   12
6-KDDDORF   20201116    2   11
6-KDDDORF   20201123    4   9
6-KDDDORF   20201130    5   5

询问

      SELECT t.*,
                SUM(Cover_Weeks) OVER (PARTITION BY Item_No, (seqnum - 1) / 4)  AS Four_Weeks_Cover
        FROM (SELECT t.*,
                     ROW_NUMBER() OVER (PARTITION BY Item_No ORDER BY Week_Starting_Monday) - 1 as seqnum
              FROM Table_Name t
             ) t;

标签: sqlsql-server

解决方案


一种解决方案是cross apply

SELECT t.*, t2.cover_week_4
FROM Table_Name t CROSS APPLY
     (SELECT SUM(t2.Cover_Weeks) as cover_week_4
      FROM Table_Name t2
      WHERE t2.Item_No = t.Item_No AND
            t2.Week_starting_Monday <= t.Week_starting_Monday AND
            t2.Week_starting_Monday >= DATEADD(day, -21, t.Week_starting_Monday)
     ) t2;

推荐阅读