Sql server SQL Server:如何在同一个表中为不同的客户获得3天的滚动总和

Sql server SQL Server:如何在同一个表中为不同的客户获得3天的滚动总和,sql-server,Sql Server,这是输入表: Customer_ID Date Amount 1 4/11/2014 20 1 4/13/2014 10 1 4/14/2014 30 1 4/18/2014 25 2 5/15/2014 15 2 6/21/2014 25 2 6/22/2014 35 2 6/23/2014

这是输入表:

Customer_ID  Date       Amount
1            4/11/2014  20
1            4/13/2014  10
1            4/14/2014  30
1            4/18/2014  25
2            5/15/2014  15
2            6/21/2014  25
2            6/22/2014  35
2            6/23/2014  10
有关于多个客户的信息,我想为每个客户获得一个3天窗口的滚动总和。 解决方案应如下所示:

Customer_ID  Date       Amount  Rolling_3_Day_Sum
1            4/11/2014  20      20
1            4/13/2014  10      30
1            4/14/2014  30      40
1            4/18/2014  25      25
2            5/15/2014  15      15
2            6/21/2014  25      25
2            6/22/2014  35      60
2            6/23/2014  10      70
最大的问题是我没有每天的事务,因为按行号划分的分区不起作用

我在SO上找到的最接近的例子是: 但是,即使在这种情况下,每天都会有一些交易,这些交易适应了基于行数的解决方案

rownumber查询如下所示:

select customer_id, Date, Amount, 
Rolling_3_day_sum = CASE WHEN ROW_NUMBER() OVER (partition by customer_id ORDER BY Date) > 2
    THEN SUM(Amount) OVER (partition by customer_id ORDER BY Date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
    END
from #tmp_taml9
order by customer_id

我想知道是否有办法用[DATE-2]和[DATE]

之间的日期替换前面的2行和当前的2行。一种方法是使用日历表或类似的工具来获取完整的日期范围,然后将表与之左键连接,并使用基于行数的解决方案

另一个可能对性能不确定的选项是使用如下应用查询:

select customer_id, Date, Amount, coalesce(Rolling_3_day_sum, Amount) Rolling_3_day_sum
from #tmp_taml9 t1 
cross apply (
    select sum(amount) Rolling_3_day_sum 
    from #tmp_taml9 
    where Customer_ID = t1.Customer_ID 
      and datediff(day, date, t1.date) <= 3 
      and t1.Date >= date
) o
order by customer_id;

但我怀疑性能可能不太好。

每天需要汇总3条记录。连接到具有三条包含值0、1、2的记录的表。从日期中减去。外部将结果连接回原始表并聚合。您的交叉应用解决方案工作得非常好!谢谢。我被方法划分的过程深深吸引,以至于我从来没有想过另一种方法。再次感谢。@AragornStack很乐意帮忙!