2016-12-05 62 views
1

值說我有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 

所以2016年12月6日輸出爲30 +(-5)+ 10 = 35和12/7/2016是30 + 10 = 40 輸出12/6/2016 = 12/4/2016 + 12/7/2016 + 12/8/2016

有沒有辦法指定一個特定的行OVER子句或什麼是最佳方法?我使用SQL SERVER

謝謝

+1

你可以檢查樣本數據和問題是有聯繫嗎?例如,比較你的數據,這篇文章「所以12/6/2016輸出是30 +(-5)+ 10 = 35和12/7/2016是30 + 10 = 40」,其中-5和10來自於12/6/2016? – DVT

+2

我完全不理解你的邏輯。 –

+0

要獲得以前的值,可以使用'LAG()',但不確定你的邏輯。第一個值是30? –

回答

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 
+0

所以我猜'12-05'是一個錯字? –

+0

@JuanCarlosOropeza我想是的,我看到他把它刪除了。 –

+0

是的,我的道歉......你的First_Value(delta)是什麼? – user3697498