我有来自excel表的数据中的重复行。在SSIS包中,我使用排序转换,其中排序由主键列ID按升序完成。但在删除重复项之前,我想看看电子邮件列是否包含我公司域名的电子邮件。如果是这样,我希望删除除具有此类电子邮件地址的行之外的其他行。我该怎么办?请参阅下面的图片。
在上面的数据中,我想删除两行John,其中电子邮件地址为john@gmail.com。在Maria的情况下,我想删除两行电子邮件地址maria@gmail.com,因此保留了具有域mycompany.com的电子邮件地址的行。如果拥有域mycompany.com的电子邮件地址的用户有多行,我希望将任何一行保留为域电子邮件地址。
建议。
答案 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:
我的测试数据:
有些观点:
条件拆分:首先用mycompany和没有mycompany的行分隔行。
Sort和non_mycompany sort:对id上的输出进行排序并删除重复项。
mycompany_multicast:使用mycompany
创建两个行副本合并连接:将没有mycompany的左连接行添加到包含mycompany的行。注意连接顺序,目的是获取没有mycompany的行,并且在mycompany的行中没有匹配的id。
条件split1:使用mycompany获取没有mycompany的行,并且在行中没有匹配的id。您可以使用mycompany从行检查id,如果id为null,则该行与mycompany的行没有匹配。
结合所有:结合最终结果