SQL Server:如何为同一张表中的不同客户获取 3 天内的滚动总和

Posted

技术标签:

【中文标题】SQL Server:如何为同一张表中的不同客户获取 3 天内的滚动总和【英文标题】:SQL Server: How to get a rolling sum over 3 days for different customers within same table 【发布时间】:2015-08-26 22:34:47 【问题描述】:

这是输入表:

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 上找到的最接近的例子是: SQL Query for 7 Day Rolling Average in SQL Server 但即使在那种情况下,每天都会进行一些交易,这些交易适应了​​基于 rownumber() 的解决方案

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

我想知道是否有办法将“BETWEEN 2 PRECEDING AND CURRENT ROW”替换为“BETWEEN [DATE - 2] 和 [DATE]”

【问题讨论】:

每天需要汇总 3 条记录。加入一个包含三个包含值 (0,1,2) 的记录的表。从日期中减去。将结果外连接回原表并聚合。 【参考方案1】:

一种选择是使用日历表(或类似的东西)来获取完整的日期范围,然后将其加入您的表并使用基于 row_number 的解决方案。

另一个可能工作的选项(不确定性能)是使用apply这样的查询:

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;

我怀疑性能可能不是很好。

【讨论】:

您的交叉应用解决方案效果很好!非常感谢。我是如此沉迷于方法分区,以至于我什至从未想过其他方法。再次感谢。 @AragornStack 乐于助人!

以上是关于SQL Server:如何为同一张表中的不同客户获取 3 天内的滚动总和的主要内容,如果未能解决你的问题,请参考以下文章

在sql语句实现查询一张表中的同一个属性的不同字段的所有数据

如何在sql中将同一张表中的两个值连接起来?

sqlserver创建一个新表,求助

如何为 SQL Server 和 SQL Server Compact 编写相同的 ado.net 代码?

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

汇总SQL中2个不同表中的3列