优先于列数据删除 SSIS 包中的重复项
Remove duplicate in SSIS package with preference over a column data
我在来自 excel sheet 的数据中有重复的行。在 SSIS 包中,我使用排序转换,其中排序按主键列 ID 升序进行。但在删除重复项之前,我想查看电子邮件列是否包含我公司域的电子邮件。如果是这样,我希望删除具有此类电子邮件地址的行以外的其他行。我应该怎么办?请参考下面的图片。
在上面的数据中,我想删除电子邮件地址为 john@gmail.com 的两行 John。在 Maria 的例子中,我想删除电子邮件地址为 maria@gmail.com 的两行,从而保留电子邮件地址为域 mycompany.com 的行。如果有多行用户拥有域 mycompany.com 的电子邮件地址,我想保留域电子邮件地址的任何一行。
请推荐。
您可以使用这样的语句:
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
它按相似的 ID 和电子邮件对所有行进行排序(带有@mycompany 的首选邮件是列表中的第一个),然后在每个组上添加一个行号,最后,它删除所有行号更高的行到 1(这些是重复的)
这里是要测试的数据:
CREATE TABLE Persons (
id NUMERIC(5),
NAME VARCHAR(200),
email VARCHAR(400) );
INSERT INTO persons
VALUES ( 100,
'john',
'john@mycompany.com'),
( 100,
'john',
'john@gmail.com'),
( 100,
'john',
'john@gmail.com');
INSERT INTO persons
VALUES ( 200,
'maria',
'maria@mycompany.com'),
( 200,
'maria',
'maria@gmail.com'),
( 200,
'maria',
'maria@gmail.com');
INSERT INTO persons
VALUES ( 300,
'jean',
'jean@mycompany.com'),
( 300,
'jean',
'jean@gmail.com'),
( 300,
'jean',
'jean@mycompany.com'),
( 300,
'jean',
'jean@mycompany.com');
INSERT INTO persons
VALUES ( 400,
'tom',
'tom@gmail.com'),
( 400,
'tom',
'tom@gmail.com');
你可以在 sql 中做到这一点,就像 Kobi 展示的那样,这可能更容易。但是如果你更喜欢 ssis:
我的测试数据:
几点:
有条件的分割:首先你将有 mycompany 的行和没有的行分开。
排序和 non_mycompany 排序:根据 id 对输出进行排序并删除重复项。
mycompany_multicast: 使用 mycompany
创建两个行副本
合并连接:将没有 mycompany 的行左连接到有 mycompany 的行。注意连接顺序,目的是获取没有 mycompany 的行,并且在有 mycompany 的行中没有匹配的 id。
条件拆分 1:取没有 mycompany 的行,并且在有 mycompany 的行中没有匹配的 id。您可以使用 mycompany 从行中检查 id,如果 id 为 null,则该行在与 mycompany 的行中没有匹配项。
union all:合并最终结果
我在来自 excel sheet 的数据中有重复的行。在 SSIS 包中,我使用排序转换,其中排序按主键列 ID 升序进行。但在删除重复项之前,我想查看电子邮件列是否包含我公司域的电子邮件。如果是这样,我希望删除具有此类电子邮件地址的行以外的其他行。我应该怎么办?请参考下面的图片。
在上面的数据中,我想删除电子邮件地址为 john@gmail.com 的两行 John。在 Maria 的例子中,我想删除电子邮件地址为 maria@gmail.com 的两行,从而保留电子邮件地址为域 mycompany.com 的行。如果有多行用户拥有域 mycompany.com 的电子邮件地址,我想保留域电子邮件地址的任何一行。
请推荐。
您可以使用这样的语句:
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
它按相似的 ID 和电子邮件对所有行进行排序(带有@mycompany 的首选邮件是列表中的第一个),然后在每个组上添加一个行号,最后,它删除所有行号更高的行到 1(这些是重复的)
这里是要测试的数据:
CREATE TABLE Persons ( id NUMERIC(5), NAME VARCHAR(200), email VARCHAR(400) );
INSERT INTO persons VALUES ( 100, 'john', 'john@mycompany.com'), ( 100, 'john', 'john@gmail.com'), ( 100, 'john', 'john@gmail.com');
INSERT INTO persons VALUES ( 200, 'maria', 'maria@mycompany.com'), ( 200, 'maria', 'maria@gmail.com'), ( 200, 'maria', 'maria@gmail.com');
INSERT INTO persons VALUES ( 300, 'jean', 'jean@mycompany.com'), ( 300, 'jean', 'jean@gmail.com'), ( 300, 'jean', 'jean@mycompany.com'), ( 300, 'jean', 'jean@mycompany.com');
INSERT INTO persons VALUES ( 400, 'tom', 'tom@gmail.com'), ( 400, 'tom', 'tom@gmail.com');
你可以在 sql 中做到这一点,就像 Kobi 展示的那样,这可能更容易。但是如果你更喜欢 ssis:
我的测试数据:
几点:
有条件的分割:首先你将有 mycompany 的行和没有的行分开。
排序和 non_mycompany 排序:根据 id 对输出进行排序并删除重复项。
mycompany_multicast: 使用 mycompany
创建两个行副本合并连接:将没有 mycompany 的行左连接到有 mycompany 的行。注意连接顺序,目的是获取没有 mycompany 的行,并且在有 mycompany 的行中没有匹配的 id。
条件拆分 1:取没有 mycompany 的行,并且在有 mycompany 的行中没有匹配的 id。您可以使用 mycompany 从行中检查 id,如果 id 为 null,则该行在与 mycompany 的行中没有匹配项。
union all:合并最终结果