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很乐意帮忙!