如何使用窗口函数根据日期或排名列聚合数据?

use*_*574 0 sql t-sql sql-server window-functions

因此,我有一个发货列表,并且有订单总额和每个单独发货的总额,但我正在努力想出代码来为累计发货创建一个附加列,其中包括当前发货,加上该订单之前的所有发货。这是我到目前为止所得到的结果:

订单号 发货日期 合计订单 出货总量 累计出货量
22396 2022-04-04 639,964 2,983 639,966 3
22396 2022-03-31 639,964 5,626 639,966 2
22396 2022-02-24 639,964 631,355 639,966 1

因此,这是同一订单的 3 次单独发货。第 3 行中的第一次发货是正确的,但我需要第 2 行的累计发货列是两者的发货总和,因此 631,555 美元 + 5,626 美元。按照相同的逻辑,第 1 行应该是所有 3 行的总和,此时将等于订单总额 639,964 美元。看起来是这样的:

订单号 发货日期 合计订单 出货总量 累计出货量
22396 2022-04-04 639,964 2,983 639,964 3
22396 2022-03-31 639,964 5,626 636,981 2
22396 2022-02-24 639,964 631,355 631,355 1

我假设实现此目的的最佳方法是使用 over(partition by ()),但我正在努力想出代码。这是我到目前为止所拥有的:

SELECT
    OrderNo,
    ShipDate,
    OrderTotal,
    [Shipment Total],
    SUM([Shipment Total]) OVER(PARTITION BY OrderNo) AS [Cumulative Shipments],
    [Rank]
FROM Shipments
WHERE OrderNo = '22396'
Run Code Online (Sandbox Code Playgroud)

[Rank] 列来自早期的 CTE,它根据发货日期计算该货件的排名:

ROW_NUMBER() OVER(PARTITION BY d.OrderNo ORDER BY d.ShipDate) AS [Rank]
Run Code Online (Sandbox Code Playgroud)

我需要类似 SUM([Shipment Total]) 的东西,其中排名等于或小于当前排名。我确信日期列可以完成同样的事情,但只是不确定如何完成查询

Stu*_*Stu 5

您似乎已经完成了一半,只是缺少功能累积总和的排序标准,例如

select *, 
  Sum(ShipmentTotal) 
    over(partition by OrderNo 
         order by ShipDate rows between unbounded preceding and current row)
from Shipments;
Run Code Online (Sandbox Code Playgroud)