优先于列数据删除 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:合并最终结果