2017-02-11 175 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 

如果你看一下源數據e具有最新的日期,是有關係的a->b->c->d-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 ,您指出的原始數據在datetime.i中,通過添加一行('z','y','14-dec-2017','15-dec-2017')來測試此查詢。在這種情況下,記錄「e」與z和y沒有任何關係,但仍然映射到e。你能否建議我們在有沒有關係的記錄之間應該如何處理?這些記錄應該保持原樣。 – lms

+0

那你期望的結果是什麼?您可以添加'和t1.date1!= t2.date1'到最後,但不知道如何處理「y」。 –

+0

我想將y帶入id1列,因爲「y」與z相比有最新的日期。在這種關係處理之後,id1列將始終是主記錄 – lms