2016-04-27 7 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 

を私はOを持つ集約関数SUMを使用してみました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プロシージャ、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の行から開始し、現在の行と次の行(T.id-1)を結合し、最後の行(id = 4)に達するまで続行する再帰CTEを使用します。これ以上結合することはできません –

関連する問題