Удалить дубликаты из промежуточного файла
-
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