2016-11-18 94 views
5

我有一些數據駐留在表中,我可以輕鬆地從中進行選擇,並且需要根據前一行的值計算每行的輸出值,但第一行除外使用我在初始選擇查詢中計算的值進行計算。我已經嘗試了遞歸代碼的多次迭代,並使用了CTE,但是我一直未能成功實現它。我瘋狂地試圖讓它工作,我寧願不運行一個循環,因爲它需要很長時間才能完成。我們正在運行SQL Server 2012和我寫在2014年SSMSSQL-Server遞歸查詢

select 1 as rn, 1.5 x1, 2.5 x2, 2.0 x3, 45 y1, 42 y2, 43 ild into #x 
union all 
select 2 as rn, 1.7 x1, 2.2 x2, 2.1 x3, 55 y1, 12 y2, 43 ild 

代碼的代碼來計算第一行是

select x1*y1 + x2*y2 + x3 * ild from #x where rn = 1 

代碼到n行計算第二行

select x1*y1 + x2*y2 + x3 * (previous row's calculated value) 

請讓我知道,如果有我丟失的東西,因爲我有8760行數據,我需要通過57次(每次爲不同的數據集)滾動,做循環並不快enoug h爲我所需要的。

+2

使用LAG/LEAD?這可能比遞歸cte – dfundako

+0

更容易如果我使用滯後,這不會導致我在查詢結束時有8759嵌入式計算嗎?意思是,第2行取決於第1行的計算結果,第3行取決於第2行的計算結果,這取決於第1行的計算結果。因此第3行將類似於 'code' select x1 * y1 + x2 * y2 + x3 *(x1 * y1 + x2 * y2 + x3 *(x1 * y1 + x2 * y2 + x3 * ild))'code' 其中第一個圓括號內的x值屬於行它是從 –

+0

計算的,使用遊標和for循環的過程可能是用於這種級聯計算的好方法。 – LukStorms

回答

4

這裏是一個遞歸CTE,但我不能給87000行業績說話

;with cte as (
    Select rn ,Calc = cast(x1*y1 + x2*y2 + x3 * ild as money) from #x Where rn=1 
    Union All 
    Select r.rn,cast(r.x1*r.y1 + r.x2*r.y2 + r.x3 * p.Calc as money) 
    From #x r 
    Join cte p on r.rn=p.rn+1 
) 
Select * from cte 
Option (MAXRECURSION 0) 

返回

rn Calc 
1 258.50 
2 662.75 

我要注意:我假設RN是用增量沒有差距

+0

感謝您。我會試試這個報告。 –

+0

哈哈,貼了幾乎相同的答案,沒有得到像我通常做的時候,當有另一個答案張貼。刪除了我的。 – randcd

+0

窗口函數,LAG,LEAD等通常比CTE快很多,因爲服務器理解並優化它們。 –