2017-02-11 7 views
0

私は以下のデータセットを持っており、最新の日付に基づいてマスターレコードを特定し、結果に示されている関係が存在する場合、そのレコードを親子マッチレコードとして生成する必要があります。照合セットのSQL比較列

id1 id2 date1  date2 
a b 1-dec-17 2-dec-17 
b c 2-dec-17 30-nov-17 
a e 1-dec-17 15-dec-17 
d e 14-dec-17 15-dec-17 
z y 14-dec-17 15-dec-17 

ここで予想される出力は次のようになります。

id1 id2 date1  date2 
e a 15-dec-17 1-dec-17 
e b 15-dec-17 2-dec-17 
e c 15-dec-17 30-nov-17 
e d 15-dec-17 14-dec-17 
y z 15-dec-17 14-dec-17 

あなたが最新の日付を持っており、関係a->b->c->d-eがあるeソースデータを見れば。

また、結果のid1の列はマスターレコードである必要があります。

+0

「date2」の計算方法はわかりません。 –

+0

a-> b、b-> cであり、a→cである。 aがeに関連する場合、同じ方法ではe-> bおよびe> cを意味します。ここでc - > bはc - > aを意味し、a - > eはc - > eを意味し、別のレコードd - > eはaとcがeを介してdに関連することを意味する – lms

答えて

0

以下はあなたが望む結果を生み出すコードですが、結果が保証されていない可能性があります。可能であれば、重複した日付を持つことができます。

SELECT id1, id2, CAST(date1 as DATETIME) as date1, CAST(date2 as DATETIME) as date2 INTO #tbl_Temp FROM (VALUES ('a','b','1-dec-2017','2-dec-2017'), ('b','c','2-dec-2017','30-nov-2017'), ('a','e','1-dec-2017','15-dec-2017'), ('d','e','14-dec-2017','15-dec-2017') ) as a (id1, id2, date1, date2) GO ;WITH tbl as ( SELECT id1, date1 FROM #tbl_Temp UNION SELECT id2, date2 FROM #tbl_Temp ) SELECT t1.id1, t2.id1 as id2, t1.date1, t2.date1 as date2 FROM tbl as t2 INNER JOIN ( SELECT TOP 1 id1, date1 FROM tbl WHERE date1 = (SELECT MAX(date1) FROM tbl) ) as t1 ON t1.id1 != t2.id1 私は元のテーブルを再設計することをお勧めします。それは正しく見えません。

+0

ありがとう@Slava Murygin ( 'z'、 'y'、 '14-dec-2017'、 '15-dec-2017')を追加して、このクエリをテストしました。この場合、レコード "e"はzとyとの関係はありませんが、eにマップします。関係のないレコードがあるときに、どのように処理すべきかを提案できますか?それらの記録はそのまま残るべきです。 – lms

+0

あなたはどんな結果を期待しますか? 'とt1.date1!= t2.date1'を最後に追加できますが、どのように" y "を扱うかはわかりません。 –

+0

"y"はzと比較して最新の日付を持っているので、id1列にyを入れたいと思います。このようにid1列は常にこの関係処理の後のマスターレコードになります – lms