2017-02-11 1 views
0

Ich habe die Datenmenge unten und muss einen Stammdatensatz basierend auf dem spätesten Datum identifizieren und die Ausgabe als Elternteil untergeordnete Datensätze erzeugen, wenn eine Beziehung existiert, wie im Ergebnis gezeigt.SQL - Spalten für übereinstimmende Menge vergleichen

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 

Hier ist der Ausgang zu erwarten ist:

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 

Wenn man sich die Quelldaten sehen e hat das letzte Datum und es gibt eine Beziehung a->b->c->d-e.

Auch die Spalte id1 im Ergebnis sollte Stammsatz sein.

+0

Ich sehe nicht, wie 'date2' berechnet wird. –

+0

a-> b, b-> c dort a-> c. Gleicher Weg, wenn a mit e in Beziehung steht, bedeutet e-> b und e> c. hier c -> b, bedeutet c-> a, und a-> e was c-> e bedeutet, gibt es einen weiteren Datensatz, d-> e was bedeutet, dass a und c sind verwandt mit d über e – lms

Antwort

0

Unten ist ein Code, der das gewünschte Ergebnis liefert, aber das Ergebnis ist nicht garantiert, da Sie möglicherweise Datumsduplikate haben können.

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 BTW Ich würde vorschlagen, die ursprüngliche Tabelle neu zu gestalten. Es sieht nicht gut aus.

+0

danke @Slava Murygin Die Originaldaten, auf die Sie hingewiesen haben, befinden sich in datetime.i habe diese Abfrage getestet, indem Sie eine Zeile hinzufügen ('z', 'y', '14-dec-2017', '15-dec-2017'). in diesem Fall hat die Aufzeichnung "e" keine Beziehung mit z und y, aber sie wird trotzdem auf e abgebildet. Könnten Sie vorschlagen, wie wir damit umgehen sollten, wenn es Datensätze gibt, zwischen denen keine Beziehung besteht? diese Aufzeichnungen sollten so bleiben, wie sie sind. – lms

+0

Welches Ergebnis würden Sie dann erwarten? Sie können 'und t1.date1! = T2.date1' am Ende hinzufügen, aber nicht sicher, wie Sie mit" y "umgehen wollen. –

+0

Ich möchte y in die ID1-Spalte bringen, weil "y" im Vergleich zu z das späteste Datum hat. Auf diese Weise ID1-Spalte wird immer ein Master-Datensatz nach dieser Beziehung Verarbeitung – lms

Verwandte Themen