Rimuovere i duplicati da un file di gestione temporanea
-
03-07-2019 - |
Domanda
Ho una tabella di gestione temporanea che contiene una serie who di righe di dati che sono state prese da un file di dati.
Ogni riga indica in dettaglio una modifica di una riga in un sistema remoto, le righe sono effettivamente istantanee della riga di origine eseguite dopo ogni modifica. Ogni riga contiene i timestamp dei metadati per la creazione e gli aggiornamenti.
Ora sto cercando di creare una tabella di aggiornamento da questi file di dati che contengono tutto l'aggiornamento. Ho bisogno di un modo per rimuovere le righe con chiavi duplicate mantenendo solo la riga con l'ultimo "aggiornamento" timestamp.
Sono consapevole di poter utilizzare l'SSIS " sort " trasformarsi per rimuovere i duplicati ordinando sul campo chiave e dicendogli di rimuovere i duplicati, ma come posso assicurarmi che la riga che conserva sia quella con l'ultimo timestamp?
Soluzione
Questo rimuoverà le righe con corrispondenza su Col1, Col2 ecc. e avrà un UpdateDate che NON è il più recente:
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
Se Col1 e Col2 devono essere considerati "corrispondenti". se sono entrambi NULL, è necessario utilizzare:
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))
...
Modifica : se è necessario effettuare un test con distinzione tra maiuscole e minuscole su un database sensibile IN , quindi nelle colonne VARCHAR e TEXT utilizzare:
ON (T.Col1 = D.Col1 COLLATE Latin1_General_BIN
OR (T.Col1 IS NULL AND D.Col1 IS NULL))
...
Altri suggerimenti
È possibile utilizzare la trasformazione Trasformazione in SSIS per ordinare il set di dati in base a più colonne. Ordina semplicemente per la chiave primaria (o il campo ID) seguito dalla colonna del timestamp in ordine decrescente.
Vedi il seguente articolo per maggiori dettagli su come lavorare con l'ordinamento Transformation?
http://msdn.microsoft.com/en-us/library /ms140182.aspx
Ha senso?
Saluti, John
Ha senso ignorare i duplicati quando si passa dalla messa in scena al tavolo finale?
Devi farlo comunque, quindi perché non inviare una query alla tabella di gestione temporanea anziché due?
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