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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top