2011-10-26 22 views
4

私は、毎日のリターンを計算したいインデックスの価格レベルのテーブル(たとえば、S & P 500)を作成しました。テーブルの構造は次のようになります。値のテーブルから算術演算を計算する

Date  Value 
2009-07-02 880.167341 
2009-07-03 882.235134 
2009-07-06 881.338052 
2009-07-07 863.731494 
2009-07-08 862.458985 

私は毎日算術リターンを計算したい(すなわち、割合リターン)指数のは、定義されたように:Pはインデックス値を表し

Daily Return = P(2)/P(1) - 1 

この場合。入力テーブルは、上記の提示を考えると、所望の出力は次のようになります。

Date  Return 
    2009-07-03 0.002349318 
    2009-07-06 -0.001016829 
    2009-07-07 -0.019977077 
    2009-07-08 -0.001473269 

自己がうまくいくに参加することを私に発生しますが、私は2番目の日付をインクリメントするための最良の方法のわからないんだけど週末を考慮するテーブル。

この問題を解決するにはどうすればよいですか?

+0

完璧、ありがとう、すべて! – Chris

答えて

2

シンプルCROSSは

SELECT 
    Tlater.Date, (Tlater.Value/TPrev2.Value) - 1 
FROM 
    MyTable Tlater 
    CROSS APPLY 
    (
    SELECT TOP 1 TPrev.Value 
    FROM MyTable TPrev 
    WHERE TPrev.Date < Tlater.Date 
    ORDER BY TPrev.Date 
    ) TPrev2 

注意を適用します。これは、LAGとデナリ(SQL Server 2012の)に些細なり

SELECT 
    OrderDate, 
    (Value/(LAG(Value) OVER (ORDER BY Date))) -1 
FROM 
    MyTable 

それとも

;WITH cPairs AS 
(
    SELECT 
     Date, 
     Value AS Curr, 
     LAG(Value) OVER (ORDER BY Date) AS Prev 
    FROM 
    MyTable 
) 
SELECT 
    Date, 
    (Curr/Prev) -1 
FROM 
    cPairs 
(、CTEをテストされていない必要がある場合があります)
2

2005+を使用している場合は、CTEと組み合わせたROW_NUMBER関数を使用できます。

;with RowNums as (select *, row_number() over (order by date) as RN from table) 
select *, r1.Value/r.Value - 1 as Return 
from RowNums r 
inner join RowNums r1 
    on r.RN = r1.RN - 1 
3
WITH cteRank AS (
    SELECT [Date], Value, 
      ROW_NUMBER() OVER(ORDER BY [Date]) AS RowNum 
     FROM YourTable 
) 
SELECT c1.[Date], c1.Value/c2.Value - 1 as [Return] 
    from cteRank c1 
     inner join cteRank c2 
      on c1.RowNum - 1 = c2.RowNum 
    where c1.RowNum > 1