对定义的行数求和 (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 hours 值 n -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;
我正在尝试对我的 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 hours 值 n -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;