2016-04-27 98 views
1

我有下面的行,我想訪問先前的行並將其值除以當前行。對於每一行,我需要計算Vi的值,該VI值等於VI-1/VI,這意味着:訪問先前的行並將它的值除以當前行

鑑於表

Table T 
id value out 
1 100 
2 200 
3 10 
4 50 

我要生成這些值

V1 = 100 
V2= 100/200 = 0.5 
V3 = 0.5/10 = 0.05 
V4 = 0.05/50 = 0.001 

所以在最後我想下面的輸出:

id value out 
1 100 100 
2 200 0.5 
3 10 0.05 
4 50 0.001 

我嘗試使用聚合函數SUM帶O VER(),但我不知道如何,因爲我需要來劃分,而不是求和值

SELECT id, value, SUM(value) OVER(ORDER BY id ROWS BETWEEN 
             1 PRECEDING AND 1 PRECEDING)/value as out 
    FROM T 

的樣本數據解決這個問題:

CREATE TABLE t(
    id  INT, 
    value INT 
); 
INSERT INTO t VALUES 
    (1, 100), (2, 200), (3, 10), (4, 50); 
+1

你是什麼意思,你不能使用T-SQL? –

+0

我的意思是我不能使用CREATE過程,創建函數... –

+0

有趣的問題! –

回答

3

不幸的是,SQL沒有Product,但它應該很容易使用cte。如果id被索引,性能應該不會太差

DECLARE @T table (id int identity(1,1) primary key, value int) 
INSERT @T VALUES (100), (200), (10), (50) 

;WITH cte AS 
(
    SELECT id, value, CAST(value AS decimal(20,4)) AS out FROM @T WHERE id = 1 
    UNION ALL SELECT T.id, T.value, CAST(cte.out/T.value AS decimal(20,4)) FROM cte INNER JOIN @T T ON cte.id = T.id - 1 
) 
SELECT * FROM cte 
+0

請看用戶輸出問題 – TheGameiswar

+2

@TheGameiswar謝謝 – Eric

+0

謝謝,現在我明白了。從id = 1的行開始,使用遞歸CTE,然後將下一行(T.id-1)加入當前行,然後繼續操作,直到到達最後一行(id = 4),無法再加入 –