2011-10-26 68 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 

我想計算出每天的算術回報(即回報率)的指標,其定義爲:

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

其中P代表的索引值這個案例。鑑於輸入表上面介紹,所需的輸出應該是這樣的:

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

它發生,我認爲自連接的工作,但我不知道的最好的方式來增加日期在第二表來計算週末。

對此有何想法?

+0

完美,謝謝大家! – Chris

回答

2

一個簡單的CROSS APPLY

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中)(未經測試,可能需要CTE)

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 
2

如果您使用的是2005+,則可以將ROW_NUMBER功能與CTE結合使用:

;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