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

자기가 일하는 것이 참여 나에게 발생하지만 나는 두 번째 날짜를 증가하는 가장 좋은 방법의 확실하지 않다 주말을 설명하기위한 테이블.

이 문제를 해결하는 가장 좋은 방법에 대한 의견이 있으십니까?

+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 서버 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 
관련 문제