2009-03-06 5 views
1

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

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

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

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

ответ

0

Это позволит удалить строки с матчем на 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)) 
     ... 

Edit: Если вам нужно сделать Чувствительный тест Case на случай В чувствительной базы данных затем на VARCHAR и TEXT столбцов используйте:

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

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

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

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

смысл Make?

Cheers, Джон

0

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

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

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