Удалить дубликат в пакете SSIS с предпочтением данных столбца

У меня есть повторяющиеся строки в данных, поступающих из листа Excel. В пакете SSIS я использую преобразование Sort, при котором сортировка выполняется в порядке возрастания по идентификатору столбца первичного ключа. Но перед удалением дубликатов я хочу посмотреть, есть ли в столбце электронной почты электронная почта с доменом моей компании. Если это так, я хочу, чтобы другие строки были удалены, кроме той, которая имеет этот тип адресов электронной почты. Что я должен делать? Пожалуйста, обратитесь к изображению, прикрепленному ниже. Изображение имеющихся у меня данных

В приведенных выше данных я хочу удалить две строки Джона, где адрес электронной почты [email protected]. В случае с Марией я хочу удалить две строки с адресами электронной почты [email protected], тем самым сохранив строки с адресами электронной почты домена mycompany.com. Если есть несколько строк для пользователя, имеющего адреса электронной почты домена mycompany.com, я хочу сохранить любую строку с адресом электронной почты домена.

Предложите пожалуйста.


person sangam    schedule 18.08.2016    source источник


Ответы (2)


вы можете сделать это в sql, как показал Коби, это может быть проще. Но если вы предпочитаете в ssis:

Мои тестовые данные:

введите здесь описание изображения

введите здесь описание изображения

Некоторые моменты:

Условное разделение: сначала вы разделяете строки с mycompany и без них.

Сортировка и сортировка не_mycompany: сортировка вывода по идентификатору и удаление дубликатов.

mycompany_multicast: создать две копии строк с mycompany

Объединение слиянием: левое соединение строк без mycompany со строками с mycompany. Обратите внимание на порядок соединения, цель состоит в том, чтобы получить строки без mycompany и без совпадения идентификаторов в строках с mycompany.

введите здесь описание изображения

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

введите здесь описание изображения

объединение всех: объединение конечного результата

person thotwielder    schedule 18.08.2016

Вы можете использовать такое утверждение:

WITH T AS
(
SELECT ROW_NUMBER() OVER (partition BY id ORDER BY id, CASE WHEN email LIKE '%@mycompany.com' THEN 0 ELSE 1 END ) rn FROM persons
)
DELETE FROM T
 WHERE rn > 1

Он сортирует все строки по похожему идентификатору и адресу электронной почты (предпочтительная почта с @mycompany является первой в списке), затем добавляет номер строки в каждую группу и, чтобы закончить, удаляет все строки, номер строки которых больше 1 (тезисы дубликаты)

Вот данные для проверки:

CREATE TABLE Persons (id NUMERIC(5), NAME VARCHAR(200), электронная почта VARCHAR(400));

ВСТАВЬТЕ В человека ЗНАЧЕНИЯ ( 100, 'джон', 'джон@mycompany.com'), ( 100, 'джон', 'джон@gmail.com'), ( 100, 'джон', 'джон@gmail.com' );

ВСТАВЬТЕ В человека ЗНАЧЕНИЯ ( 200, 'мария', 'мария@mycompany.com'), ( 200, 'мария', 'мария@gmail.com'), ( 200, 'мария', 'мария@gmail.com' );

ВСТАВЬТЕ В человека ЗНАЧЕНИЯ ( 300, 'джин', 'жан@mycompany.com'), ( 300, 'джин', 'жан@gmail.com'), ( 300, 'джин', 'джин@mycompany.com' ), ( 300, 'джин', 'джин@mycompany.com');

ВСТАВЬТЕ В человека ЗНАЧЕНИЯ ( 400, 'tom', '[email protected]'), ( 400, 'tom', '[email protected]');

person Kobi    schedule 18.08.2016
comment
Я обязан сделать это из пакета ssis. - person sangam; 25.08.2016