Pergunta

Eu tenho uma tabela de estadiamento que contém uma série de linhas de dados da OMS que foram retiradas de um arquivo de dados.

Cada linha detalha uma alteração em uma linha em um sistema remoto, as linhas são efetivamente instantâneas da linha de origem tiradas após cada alteração. Cada linha contém timestamps de data e hora de dados para criação e atualizações.

Agora estou tentando criar uma tabela de atualização a partir desses arquivos de dados que contêm toda a atualização. Preciso de uma maneira de remover linhas com teclas duplicadas, mantendo apenas a linha com o mais recente registro de data e hora de atualização.

Estou ciente de que posso usar o SSIS "Sort" Transform para remover duplicatas, classificando -o no campo principal e dizendo para remover duplicatas, mas como garanto que a linha que mantém é a que é a mais recente carimbo de hora?

Foi útil?

Solução

Isso removerá linhas com o Match no Col1, Col2 etc. e terá um atualizado que não é o mais 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 precisarem ser considerados "correspondentes" se ambos forem nulos, você precisará usar:

       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))
      ...

Editar: Se você precisar fazer um teste sensível ao caso em um caso DENTROBanco de dados sensível e então nas colunas Varchar e Text Use:

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

Outras dicas

Você pode usar a transformação de classificação no SSIS para classificar seu conjunto de dados por mais de uma coluna. Simplesmente classifique por sua chave primária (ou campo de identificação) seguido pela coluna de registro de data e hora em ordem decrescente.

Veja o artigo a seguir para obter mais detalhes sobre como trabalhar com a transformação de classificação?

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

Faz sentido?

Saúde, John

Faz sentido ignorar as duplicatas ao passar da tabela de estadiamento para a tabela final?

Você tem que fazer isso de qualquer maneira, então por que não emitir uma consulta contra a tabela de estadiamento em vez de duas?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top