2016-12-05 65 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