2014-12-16 3 views
7

동일한 테이블의 2 행 간의 차이를 비교하는 방법론을 찾고 있습니다. 내가 여기에서 발견했던 것에서 (How to get difference between two rows for a column field?) 거의 내가 원했던 것이다.sql 2 행 간의 차이 계산

create table #tmpTest 
(
    id_fund int null, 
    id_ShareType int null, 
    ValueDate datetime null, 
    VarNAV float null, 
    FundPerf float null, 
) 

insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV) 
values(1,1,'20140101',100) 
insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV) 
values(1,1,'20140102',20) 

update #tmpTest 
set hrc.FundPerf = (isnull(hrn.VarNAV, 0) - hrc.VarNAV)/hrc.VarNAV 
from #tmpTest hrc 
left join #tmpTest hrn on hrn.ValueDate = (select min(ValueDate) from #tmpTest where ValueDate > hrc.ValueDate) 
and hrc.id_fund = hrn.id_fund and hrc.id_ShareType = hrn.id_ShareType 

내 문제는 내가 그 결과 본 계약 대신 라인 2.

의 라인 1에 시작을 계산하고있어 결과가 내가 얻을 수있어 것을 : 나는 다음과 같은 코드를 수행 한

id_fund id_ShareType ValueDate   VarNAV      FundPerf      
------- ------------ ------------------- ------- ----------------------------- 
     1   1 2014-01-01 00:00:00  100       -0.8 
     1   1 2014-01-02 00:00:00  20       -1 

내가 그렇게 싶습니다 반면 :

id_fund id_ShareType ValueDate   VarNAV      FundPerf      
------- ------------ ------------------- ------- ----------------------------- 
     1   1 2014-01-01 00:00:00  100       -1 
     1   1 2014-01-02 00:00:00  20       -0.8 

내 접근 방식에 어떤 문제가 있습니까?

+4

'LAG'하여 사용하여 얻을 수 있습니다 'LEAD'는 기능을합니까? – Kermit

답변

1

최소한 동일한 펀드 및 공유 유형으로 제한하지 않습니다.

update #tmpTest 
    set hrc.FundPerf = (isnull(hrn.VarNAV, 0) - hrc.VarNAV)/hrc.VarNAV 
    from #tmpTest hrc left join 
     #tmpTest hrn 
     on hrn.ValueDate = (select min(ValueDate) 
          from #tmpTest tt 
          where tt.ValueDate > hrc.ValueDate and 
            hrc.id_fund = tt.id_fund and hrc.id_ShareType = tt.id_ShareType 
          ) and 
      hrc.id_fund = hrn.id_fund and hrc.id_ShareType = hrn.id_ShareType ; 
+0

당신이 맞아요! 고맙습니다. :) – sa6

0

이 시도 :

update hrn 
set FundPerf = (isnull(hrn.VarNAV, 0) - hrc.VarNAV)/hrc.VarNAV 
from #tmpTest hrc 
left join #tmpTest hrn on hrn.ValueDate = (select min(ValueDate) from #tmpTest where ValueDate > hrc.ValueDate) 
and hrc.id_fund = hrn.id_fund and hrc.id_ShareType = hrn.id_ShareType 
+0

또한 @Gordon Linoff가 제안한 바와 같이 최소한의 자금 및 공유 유형을 제한하십시오. – Russop

+0

정말로 정확합니다. 제한해야합니다. 그럼에도 불구하고, 이것은 내 문제를 해결하지 못합니다. – sa6

+0

그럴 수 있습니다. hrc 대신 hrn을 업데이트하면 반환 값은 날짜와 정렬됩니다 (첫 번째 날의 성능은 NULL 임). – Russop

0

안녕하세요 당신이 CTE (공통 테이블 식)

create table #tmpTest 
(
    id_fund int null, 
    id_ShareType int null, 
    ValueDate datetime null, 
    VarNAV float null, 
    FundPerf float null, 
) 

insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV) 
values(1,1,'20140101',100) 
insert into #tmpTest(id_fund, id_ShareType, ValueDate, VarNAV) 
values(1,1,'20140102',20) 

;With tbl as 
사용할 수없는 이유는 무엇

(Select Row_Number() OVER (Order by T.ValueDate) as RowNumber,* From #tmpTest T )SELECT Cur.*,(ISNULL(Cur.VarNAV,0) - ISNULL(Prv.VarNAV,0))/Prv.VarNAV as [Col Name] FROM tbl Cur LEFT OUTER JOIN tbl Prv ON Cur.RowNumber = Prv.RowNumber+1 ORDER BY Cur.ValueDate

+0

코드를 강조 표시하고 Ctrl + K를 누르면 더 쉽게 읽을 수 있습니다. [여기에 서식을 지정하는 방법] (http://meta.stackexchange.com/a/22189)을 참조하십시오. – AHiggins