2016-12-05 6 views
1

に固定値を持ち、私はしかし窓関数

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

FruitTableテーブルがあるとし、それが設計されています。

Iは出力したい:

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であり、そして2015年12月7日は30 + 10 = 40 出力12/6/2016 = 12/4/2016 + 12/7/2016 + 12/8/2016

特定の行を指定する方法はありますかOVER句、またはアプローチする最善の方法は何でしょうか?私は

は、サンプルデータと質問が接続されている場合は、

+1

を確認することができますありがとうございSQL Serverを使用していますか?たとえば、あなたのデータと比較すると、この作品は "30/6/2016の出力は30 +(-5)+ 10 = 35で、2016年12月7日は30 + 10 = 40"です。 2016年6月6日から来ていますか? – 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(デルタ)は何ですか? – user3697498