2016-04-27 78 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),无法再加入 –