Удалить дубликаты из промежуточного файла

StackOverflow https://stackoverflow.com/questions/619032

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть промежуточная таблица, которая содержит ряд строк данных who, которые были взяты из файла данных.

Каждая строка детализирует изменение строки в удаленной системе, строки фактически являются снимками исходной строки, сделанные после каждого изменения. Каждая строка содержит метаданные временных меток для создания и обновления.

Сейчас я пытаюсь создать таблицу обновлений из этих файлов данных, которые содержат все обновления. Мне требуется способ удаления строк с дублирующимися ключами, сохраняя только строку с последним обновлением " update " метка времени.

Я знаю, что могу использовать службы SSIS " сортировать " Преобразуйте, чтобы удалить дубликаты, отсортировав поле ключа и сказав, чтобы он удалял дубликаты, но как мне убедиться, что строка, в которой он хранится, является строкой с самой последней отметкой времени?

Это было полезно?

Решение

Это удалит строки с соответствием в столбце Col1, Col2 и т. д. и будет иметь UpdateDate, который НЕ является самым последним:

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

Если Col1 и Col2 необходимо рассматривать как «совпадающие» если они оба равны NULL, вам нужно использовать:

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

Изменить . Если вам нужно выполнить тест с учетом регистра для чувствительной к регистру базы данных IN , то для столбцов VARCHAR и TEXT используйте:

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

Другие советы

Вы можете использовать Преобразование сортировки в SSIS для сортировки набора данных по нескольким столбцам. Просто выполните сортировку по первичному ключу (или полю идентификатора), а затем по столбцу отметки времени в порядке убывания.

См. следующую статью для получения дополнительной информации о работе с сортировкой Transformation?

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

Имеет смысл?

Приветствия, Джон

Имеет ли смысл просто игнорировать дубликаты при переходе от промежуточной к финальной таблице?

Вы все равно должны это сделать, так почему бы не выполнить один запрос к промежуточной таблице, а не два?

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top