保持Window Function中固定的值

时间:2016-12-05 19:38:01

标签: sql sql-server

说我有一张桌子 FruitTable

AsOfDate          Fruit          Delta
12/8/2016     Apple              10
12/7/2016     Apple              -5
12/6/2016     Apple              15
12/4/2016     Apple              30

然而,它的设计使得2016年12月4日(昨天)有我们当天持有的总数。

我想输出:

Date          Fruit          Cumulative
12/8/2016     Apple          30
12/7/2016     Apple          40
12/6/2016     Apple          35
12/5/2016     Apple          50

这的计算方法如下:

SELECT AsOfDate,
Fruit,
SUM(Delta) OVER (PARTITION BY Fruit ORDER BY AsOfDate DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS CUMULATIVE
FROM FruitTable

因此12/6/2016输出为30 +( - 5)+ 10 = 35且2016年12月7日为30 + 10 = 40 输出12/6/2016 = 2016年12月4日+ 2016年12月7日+ 2016年12月8日

有没有办法在OVER子句中指定特定的行,或者最好的方法是什么?我正在使用SQL SERVER

谢谢

1 个答案:

答案 0 :(得分:0)

Declare @YourTable table (AsOfDate date,Fruit varchar(25),Delta int)
Insert Into @YourTable values
('2016-12-08','Apple',10),
('2016-12-07','Apple',-5),
('2016-12-06','Apple',15),
('2016-12-04','Apple',30)

Select AsOfDate
      ,Fruit
      ,Delta
      ,Cumulative = Sum(Delta) over (Partition By Fruit Order By AsOfDate Desc) - Delta + First_Value(Delta) over (Partition By Fruit Order By IIF(Delta is null,1,0),AsOfDate)
 From  @YourTable
 Order By 1 Desc

返回

AsOfDate    Fruit   Delta   Cumulative
2016-12-08  Apple   10      30
2016-12-07  Apple   -5      40
2016-12-06  Apple   15      35
2016-12-04  Apple   30      50