2016-08-29 1 views
3

私には助けが必要なシナリオがあります。私はスタックオーバーフローのような新しいですので、私は私の質問をする際に間違いをするかどうかを教えてください。フィードバックをお待ちしています。SQLクエリの親値と最後に置換された値を取得する方法

私は次のような値であるSQL Serverのテーブルで働いています:私は最も古く、古いものがあることで、最新の値を取得するクエリを提唱しようとしています

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 

EDITを使用して、より大きな値

などの新しい日付:非上昇値に

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

関連する問題