访问先前的行并将其值除以当前行

时间:2016-04-27 02:47:28

标签: sql-server divide running-total

我有下面的行,我想访问前一行并将其值除以当前行。对于每一行,我需要计算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和OVER(),但我不知道如何解决这个问题,因为我需要除以而不是求和值

    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 个答案:

答案 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