每 3 天累计 sum() SQL
Cumulative sum() every 3 days SQL
我有一个table这样的
date amount
2020-02-01 5
2020-02-02 2
2020-02-03 10
2020-02-04 2
2020-02-06 3
2020-02-07 1
我每 3 天需要 sum() 如下:
date amount sum
2020-02-01 5 5
2020-02-02 2 7
2020-02-03 10 17
2020-02-04 2 2
2020-02-06 3 5
2020-02-07 1 1
...
所以当天数相差3时,求和应该重新开始。有些日子可能不在 table.
我尝试使用 window 函数(如 sum(amount) over (order by date)
)来执行此操作,但我不知道如何设置固定的天数并像这样获取累计总和中的日期差异。有可能在任何 SQL?
Disclaimer
The following solution was written based on a Preview version of SQL Server 2022, and thus may not reflect the final release.
有趣的是,如果您可以访问 SQL Server 2022(昨天进入预览版),您可以使用 DATE_BUCKET
将 [=12= 中的日期“四舍五入” ] 到 3 天,使用最小日期作为开始日期。
DECLARE @StartDate date,
@EndDate date;
SELECT @StartDate = MIN(date),
@EndDate = MAX(date)
FROM dbo.YourTable;
SELECT date,
SUM(amount) OVER (PARTITION BY DATE_BUCKET(DAY,3,date,@StartDate) ORDER BY date) AS Amount
FROM dbo.YourTable
WHERE date >= @StartDate
AND date <= @EndDate; --Incase this would be parametrised
预期的结果图片,因为 2022 年的小提琴不存在:
在 MS Sql 服务器中
select t.[date], t.Amount, sum(t.Amount) over(partition by datediff(d, '2020-02-01', t.[date])/3 order by t.[date]) cum
from tbl t
'2020-02-01'是您想要的开始日期。
我有一个table这样的
date amount
2020-02-01 5
2020-02-02 2
2020-02-03 10
2020-02-04 2
2020-02-06 3
2020-02-07 1
我每 3 天需要 sum() 如下:
date amount sum
2020-02-01 5 5
2020-02-02 2 7
2020-02-03 10 17
2020-02-04 2 2
2020-02-06 3 5
2020-02-07 1 1
...
所以当天数相差3时,求和应该重新开始。有些日子可能不在 table.
我尝试使用 window 函数(如 sum(amount) over (order by date)
)来执行此操作,但我不知道如何设置固定的天数并像这样获取累计总和中的日期差异。有可能在任何 SQL?
Disclaimer
The following solution was written based on a Preview version of SQL Server 2022, and thus may not reflect the final release.
有趣的是,如果您可以访问 SQL Server 2022(昨天进入预览版),您可以使用 DATE_BUCKET
将 [=12= 中的日期“四舍五入” ] 到 3 天,使用最小日期作为开始日期。
DECLARE @StartDate date,
@EndDate date;
SELECT @StartDate = MIN(date),
@EndDate = MAX(date)
FROM dbo.YourTable;
SELECT date,
SUM(amount) OVER (PARTITION BY DATE_BUCKET(DAY,3,date,@StartDate) ORDER BY date) AS Amount
FROM dbo.YourTable
WHERE date >= @StartDate
AND date <= @EndDate; --Incase this would be parametrised
预期的结果图片,因为 2022 年的小提琴不存在:
在 MS Sql 服务器中
select t.[date], t.Amount, sum(t.Amount) over(partition by datediff(d, '2020-02-01', t.[date])/3 order by t.[date]) cum
from tbl t
'2020-02-01'是您想要的开始日期。