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

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

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

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

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


person Craig Warren    schedule 06.03.2009    source источник


Ответы (3)


Это удалит строки с совпадением в 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))
       ...
person Kristen    schedule 06.03.2009

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

Дополнительные сведения о работе с преобразованием сортировки см. в следующей статье.

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

Есть смысл?

Ура, Джон

person John Sansom    schedule 06.03.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
person gbn    schedule 06.03.2009