删除SSIS包中的重复项,优先于列数据

时间:2016-08-18 08:59:04

标签: ssis ssis-2008

我有来自excel表的数据中的重复行。在SSIS包中,我使用排序转换,其中排序由主键列ID按升序完成。但在删除重复项之前,我想看看电子邮件列是否包含我公司域名的电子邮件。如果是这样,我希望删除除具有此类电子邮件地址的行之外的其他行。我该怎么办?请参阅下面的图片。 Image of data I have

在上面的数据中,我想删除两行John,其中电子邮件地址为john@gmail.com。在Maria的情况下,我想删除两行电子邮件地址maria@gmail.com,因此保留了具有域mycompany.com的电子邮件地址的行。如果拥有域mycompany.com的电子邮件地址的用户有多行,我希望将任何一行保留为域电子邮件地址。

建议。

2 个答案:

答案 0 :(得分:0)

您可以使用以下语句:

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的首选邮件是列表中的第一个),然后在每个组上添加一个rownumber,并完成后,删除所有rownumber优于1的行(这些是重复的)

以下是要测试的数据:

  

创建表人员(        id NUMERIC(5),        NAME VARCHAR(200),        电子邮件VARCHAR(400));

     

插入人        价值观(100,                 '约翰&#39 ;,                 ' john@mycompany.com'),               (100,                 '约翰&#39 ;,                 ' john@gmail.com'),               (100,                 '约翰&#39 ;,                 ' john@gmail.com');

     

插入人        价值观(200,                 '玛利亚&#39 ;,                 ' maria@mycompany.com'),               (200,                 '玛利亚&#39 ;,                 ' maria@gmail.com'),               (200,                 '玛利亚&#39 ;,                 ' maria@gmail.com');

     

插入人        价值观(300,                 '牛仔&#39 ;,                 ' jean@mycompany.com'),               (300,                 '牛仔&#39 ;,                 ' jean@gmail.com'),               (300,                 '牛仔&#39 ;,                 ' jean@mycompany.com'),               (300,                 '牛仔&#39 ;,                 ' jean@mycompany.com');

     

插入人        价值观(400,                 '汤姆&#39 ;,                 ' tom@gmail.com'),               (400,                 '汤姆&#39 ;,                 ' tom@gmail.com');

答案 1 :(得分:0)

你可以像Kobi那样在sql中做到这一点,这可能会更容易。但如果您更喜欢ssis:

我的测试数据:

enter image description here

enter image description here

有些观点:

条件拆分:首先用mycompany和没有mycompany的行分隔行。

Sort和non_mycompany sort:对id上的输出进行排序并删除重复项。

mycompany_multicast:使用mycompany

创建两个行副本

合并连接:将没有mycompany的左连接行添加到包含mycompany的行。注意连接顺序,目的是获取没有mycompany的行,并且在mycompany的行中没有匹配的id。

enter image description here

条件split1:使用mycompany获取没有mycompany的行,并且在行中没有匹配的id。您可以使用mycompany从行检查id,如果id为null,则该行与mycompany的行没有匹配。

enter image description here

结合所有:结合最终结果