对定义的行数求和 (SSMS)

Sum over defined number of rows (SSMS)

我正在尝试对我的 table 中的 hours 列求和超过定义的行数 (4) 而不是所有行。这是一个 4 周的滚动总和,但我不想要日期限制,因为周数可能不会线性增加(如示例 table 所示),只需对前 4 行求和即可。

我曾尝试对分区依据进行 row_number 定义行,但我现在的问题是如何定义整数行的总和。我不认为这是正确的方法。

select
a.week,
a.week_number,
a.name,
a.hours,
row_number() over( partition by a.week, a.name order by a.week) as partition

from my_table a

这是 table 的示例(假设第 1 周是 2021-01-25):

week week_number name hours
2021-01-25 1 John 25
2021-02-08 3 John 10
2021-02-15 4 John 20
2021-03-08 7 John 25
2021-03-22 9 John 20

所以我想对最后 4 行的周小时数 (3、4、7、9) 求和,总共 75 小时。

只需使用window函数:

sum(hours) over (partition by name
                 order by week
                 rows between 3 preceding and current row
                )

此逻辑假定您希望每个 name 独立求和,这似乎是对问题的合理解释。

Transact-SQL 中有一个很棒的函数叫做 lag 函数。

Lag(hours, n, 0) 将 return hoursn -table 中的前一行。如果 return 没有滞后(例如 table 的第一个值),它将 return 0 (您可以在滞后函数的第三个参数)

您可以使用 CTE 为您的 table:

中所有 3 个前一小时的值创建行
WITH cte_lags AS (
  SELECT 
    a.week,
    a.week_number,
    a.name,
    lag(hours, 1, 0) over( partition by a.week, a.name order by a.week) as lag_1,
    lag(hours, 2, 0) over( partition by a.week, a.name order by a.week) as lag_2,
    lag(hours, 3, 0) over( partition by a.week, a.name order by a.week) as lag_3
  FROM
    my_table a
)

然后您可以将字段相加 select 您需要的数据:

SELECT 
  week,
  week_number,
  name,
  hours,
  hours + lag_1 + lag_2 + lag_3 AS rolling_sum
FROM
  cte_lags;