2016-08-29 1 views
3

나는 도움이 필요한 시나리오가 있습니다. 나는 오버 플로우가 쌓이기에 새로운 것이므로 내 질문에 실수를 저 지르더라도 알려주십시오. 귀하의 의견을 환영합니다.SQL 쿼리에서 부모 값과 마지막으로 바뀐 값을 얻는 방법

다음과 같이 값은 어디 SQL 서버의 테이블 함께 일하고

:

OldValue NewValue Date 
------------------------------------ 
    1    2  2016-08-01 
    2    3  2016-08-03 
    101   102  2016-08-06 
    102   103  2016-08-08 
    103   105  2016-08-14 
    201   202  2016-08-06 
    202   203  2016-08-08 
    203   205  2016-08-14 
    205   209  2016-08-18 

내가 가장 오래된 얻을 것이다 쿼리와 이전 인에 의해 최신 값을 제시하려고를 로 바뀌었다. 이런 모양의 출력을 찾고 있습니다. 다음과 같이

OldValue  NewValue 
-------------------------- 
    1    3    
    101   105  
    201   209  

나는이 앞으로 넣어 쿼리는 다음과 같습니다 위의 쿼리와

select 
    a.OldCPN, b.NewCPN 
from 
    test..TestTable a 
inner join 
    TestTable b on a.NewCPN = b.OldCPN and a.date <= b.date 

을, 나는 또한 중간 수준에서 교체 된 모든 값을 얻고있다. 하지만 가장 오래된 값과 가장 바뀐 값이있는 행만 필요합니다.

이 문제에 대한 도움을 주시면 대단히 감사하겠습니다.

감사합니다.

답변

3

값이 오름차순으로 가정합니다. 재귀 CTE

; with 
cte as 
(
    -- parent record 
    select parent = OldValue, OldValue, NewValue, Date 
    from sample_data d 
    where not exists 
     (
      select * 
      from sample_data x 
      where x.NewValue = d.OldValue 
     ) 

    union all 

    -- child 
    select parent = c.parent, d.OldValue, d.NewValue, d.Date 
    from cte c 
     inner join sample_data d on c.NewValue = d.OldValue 
) 
select parent as OldValue, max(NewValue) as NewValue 
from cte 
group by parent 

편집을 사용하여 더 큰 값

같은 새로운 날짜 : 비 상승 값을

select * 
from 
(
    select parent as OldValue, NewValue, Date, rn = row_number() over (partition by parent order by Date desc) 
    from cte 
) c 
where c.rn = 1 
+0

감사를 처리하기 위해 아래에 쿼리의 마지막 부분을 변경합니다. 그것은 매력처럼 작용했습니다. SQL Server의 계층 적 쿼리에 익숙하지 않습니다. 이 쿼리는 내 생각의 범위를 넓혔습니다. –

+0

값을 증가시키지 않으면 수행 할 수있는 작업이 있는지 확인하고 싶습니다. –

+0

수정 된 검색어보기 – Squirrel

관련 문제