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