【问题标题】:Sum Column for Running Total where Overlapping Date重叠日期的运行总计的总和列
【发布时间】:2022-09-30 21:48:49
【问题描述】:

我有一张表,其中包含按日期划分的大约 300 万行客户销售额。

对于每个 CustomerID 行,我需要获取 Spend_Value 的总和 WHERE Order_Date BETWEEN Order_Date_m365 AND Order_Date

Order_Date_m365 = OrderDate 减去 365 天。

我刚刚尝试了自加入,但当然,由于行重叠日期,这给出了错误的结果。

如果有窗口函数的方法,这将是理想的,但我尝试并且不能在函数中执行日期之间的操作,除非我错过了方法。

我现在能想到的唯一方法是循环处理所有排名 1 的行到一个表中,然后在一个表中排名 2,等等,但这在 300 万行上效率很低。

关于通常如何在 SQL 中处理的任何想法?

SELECT CustomerID,Order_Date_m365,Order_Date,Spend_Value
FROM   dbo.CustomerSales 

  • 我会问你是否真的需要全部 300 万从您的查询返回的行以及您想要/需要他们在前 365 天的订单的SUM 的事实。
  • 嗨 Larnu,是的,不幸的是我需要它,因为它会在 365 天内输入到分析系统中,用户可以在其中选择任何日期范围,它将用于按 High、Lapsing、InActive 等对客户进行细分,并查看动态订单之间

标签: sql sql-server sql-server-2014


【解决方案1】:

窗口函数在这里可能对您没有帮助,因此您需要再次引用该表。我建议您使用带有子查询的APPLY 来执行此操作。如果您有相关索引,那么这可能是更有效的方法:

SELECT CS.CustomerID,
       CS.Order_Date_m365,
       CS.Order_Date,
       CS.Spend_Value,
       o.output
FROM dbo.CustomerSales CS
     CROSS APPLY (SELECT SUM(Spend_Value) AS output
                  FROM dbo.CustomerSales ca
                  WHERE ca.CustomerID = CS.CustomerID
                    AND ca.Order_Date >= CS.Order_Date_m365 --Or should this is >?
                    AND ca.Order_Date <= CS.Order_Date) o;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2021-12-18
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多