2009-03-06 2 views
1

Ich habe eine Staging-Tabelle, die eine who-Reihe von Datenzeilen enthält, die aus einer Datendatei stammen.Entfernen von Duplikaten aus einer Staging-Datei

Jede Zeile beschreibt eine Änderung an einer Zeile in einem Remote-System. Die Zeilen sind nach jeder Änderung tatsächlich Snapshots der Quellzeile. Jede Zeile enthält Metadaten-Zeitstempel für die Erstellung und Aktualisierung.

Ich versuche jetzt, eine Update-Tabelle aus diesen Dateien zu erstellen, die das gesamte Update enthalten. Ich benötige eine Möglichkeit, Zeilen mit doppelten Schlüsseln zu entfernen, wobei nur die Zeile mit dem neuesten Zeitstempel "update" beibehalten wird.

Ich bin mir bewusst, dass ich die SSIS "sort" -Transformation verwenden kann, um Duplikate zu entfernen, indem Sie das Schlüsselfeld sortieren und Duplikate angeben, aber wie stelle ich sicher, dass die Zeile die mit dem spätesten Zeitstempel ist ?

Antwort

0

Diese Reihen mit Spiel auf Col1 entfernen, Col2 usw. und eine UpdateDate haben, die nicht die letzte:

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 müssen „matching zu betrachten "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 machen müssen auf einem Fall IN sensible Datenbank dann auf VARCHAR und TEXT-Spalten verwenden:

 ON (T.Col1 = D.Col1 COLLATE Latin1_General_BIN 
      OR (T.Col1 IS NULL AND D.Col1 IS NULL)) 
     ... 
0

Sie können die Sortierumwandlung in SSIS verwenden, um Ihren Datensatz nach mehr als einer Spalte zu sortieren. Sortieren Sie einfach nach Ihrem Primärschlüssel (oder ID-Feld), gefolgt von Ihrer Zeitstempelspalte in absteigender Reihenfolge.

Weitere Informationen zum Arbeiten mit der Sortiertransformation finden Sie im folgenden Artikel.

http://msdn.microsoft.com/en-us/library/ms140182.aspx

Sinn?

Cheers, John

0

Ist es sinnvoll, nur die Duplikate zu ignorieren, wenn sie von Inszenierung zu Final Table zu verschieben?

Sie müssen dies trotzdem tun, also warum nicht eine Abfrage gegen die Staging-Tabelle statt zwei ausgeben?

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