Entfernen Sie doppelte aus einer Testdatei
-
03-07-2019 - |
Frage
Ich habe eine Testtabelle, die eine, die Serie von Datenzeilen enthält, die aus einer Datendatei genommen, wo.
Jede Zeile eine Änderung in einem entfernten System zu einer Reihe Details sind die Reihen effektiv Schnappschüsse von der Quellzeile nach jeder Änderung gemacht. Jede Zeile enthält Metadaten Zeitstempel für die Erstellung und Updates.
Ich versuche jetzt ein Update-Tabelle aus diesen Daten-Dateien zu erstellen, die alle dem Update enthalten. Ich brauche einen Weg, nur die Zeile mit den neuesten „update“ Zeitstempeln halten Zeilen mit doppelten Schlüsseln zu entfernen.
Ich bin bewusst, dass ich die SSIS „sort“ verwenden kann, verwandeln Duplikate zu entfernen, indem Sie auf dem Schlüsselfeld Sortieren und sagen, es Duplikate zu entfernen, aber wie stelle ich sicher, dass die Zeile, die es hält, ist das mit dem neuesten Zeitstempel?
Lösung
Dies entfernt Reihen mit Spiel auf Col1, Col2 usw. und eine UpdateDate haben, die nicht die neueste ist:
DELETE D
FROM MyTable AS D
JOIN MyTable AS T
ON T.Col1 = D.Col1
AND T.Col2 = D.Col2
...
AND T.UpdateDate > D.UpdateDate
Wenn Col1 und Col2 werden müssen, als „passend“, wenn sie beide NULL sind dann würden Sie verwenden müssen:
ON (T.Col1 = D.Col1 OR (T.Col1 IS NULL AND D.Col1 IS NULL))
AND (T.Col2 = D.Col2 OR (T.Col2 IS NULL AND D.Col2 IS NULL))
...
Bearbeiten : Wenn Sie einen Case Sensitive Test auf einem Kasten sensible Datenbank dann auf VARCHAR und TEXT-Spalten verwenden, um:
ON (T.Col1 = D.Col1 COLLATE Latin1_General_BIN
OR (T.Col1 IS NULL AND D.Col1 IS NULL))
...
Andere Tipps
Sie können das Sortieren in SSIS Verwandeln Sie Ihre Daten von mehr als einer Spalte sortieren. Einfach sortiert nach Primärschlüssel (oder ID-Feld), indem Sie Ihre Timestamp-Spalte gefolgt in absteigender Reihenfolge.
Sehen Sie im folgenden Artikel für weitere Details über die Art Transformation zu arbeiten?
http://msdn.microsoft.com/en-us/library /ms140182.aspx
Sinn?
Cheers, John
Ist es sinnvoll, nur die Duplikate zu ignorieren, wenn sie von Inszenierung zu Final Table zu verschieben?
Sie haben dies trotzdem zu tun, also warum eine Abfrage für die Staging-Tabelle nicht eher ausgeben als zwei?
INSERT final
(key, col1, col2)
SELECT
key, col1, col2
FROM
staging s
JOIN
(SELECT key, MAX(datetimestamp) maxdt FROM staging ms ON s.key = ms.key AND s.datetimestamp = ms.maxdt