Удалить дубликаты из промежуточного файла - PullRequest
1 голос
/ 06 марта 2009

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 06 марта 2009

Это удалит строки с соответствием на 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))
       ...
0 голосов
/ 06 марта 2009

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

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

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
0 голосов
/ 06 марта 2009

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

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

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

Имеет смысл?

Ура, Джон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...