2016-10-30 25 views
0

以下のデータセットを使用してSCDタイプ2を実装しようとしています。あなたが見ることができるように、同じクラスの複数のレコード(赤で強調表示されています)があり、これら2つを組み合わせて1つを削除したいと考えています。基本的にそのような場合は、同じクラスのminとmaxをValidFromValidToとします。SQL Server SQL - 最小値と最大値をオーバーラップして削除する

これはSQLでも実行可能ですか?私はSQL Server 2014を使用していますので、鉛やラグ関数をこのために使用することはできますが、同じクラスの連続するレコードが2つ以上ある場合はどうなりますか?

最後に、最後のレコードの有効をNULLに設定します。

助けていただけたら幸いです!

enter image description here

+1

ここに注文を示すものは何ですか? –

+0

SCDタイプ2?それは何ですか? –

+0

https://en.wikipedia.org/wiki/Slowly_changing_dimension –

答えて

1

あなたのサンプルデータは、穴が、無重複を持っています。これは、一般的にそうであるならば、これはあまりにも難しいことではありません。

select productid, class, min(validfrom) as validfrom, 
     lead(min(validfrom)) over (partition by productid order by min(validfrom)) as validto 
from (select scd.*, 
      row_number() over (partition by productid, class order by validfrom) as seqnum_pc, 
      row_number() over (partition by productid order by validfrom) as seqnum_c 
     from scd 
    ) s 
group by productid, class, (seqnum_c - seqnum_pc); 

これがどのように機能するかを理解する行番号の差が隣接するクラス値のグループを識別する方法を「取得」が必要です。私のアドバイスは、違いがどのように働くかを見るためにサブクエリ(おそらくあなたのデータのサブセット)を実行することです。

+0

素晴らしいです!はい、これは重複していないので、これは動作します!ありがとう!しかし、私たちはリード関数を使って有効ではなくvalidにすることができます。 – superted

+0

@superted。 。 。あなたのコメントが何を指しているのか分かりません。 'validto'は' lead() 'を使って計算されます。 –