根据标准确定重复项的优先级

时间:2015-04-08 02:11:36

标签: sql email duplicates

我有一个包含重复电子邮件地址的数据表。每个电子邮件地址都有一个日期,颜色(值:"黑","蓝"或"绿")和唯一ID。可能有一组重复的电子邮件地址包含两个以上的电子邮件地址(即我可能有10个相同电子邮件地址的重复),并且每组重复的电子邮件地址可能包含与其各自副本中相同或不同的颜色组。

我的目标是检索具有特定颜色和最大(日期)的电子邮件地址的ID。我想优先考虑颜色(首先"黑"然后"蓝"然后"绿")然后只有当有两个时才移动到最大(日期)或相同副本集中具有相同最高所需颜色的更多电子邮件地址。

示例1

ID          Email          Color             Date
1           xyz@xyz.com    Black             01/01/2014
2           xyz@xyz.com    Black             01/31/2014  
3           xyz@xyz.com    Blue              03/31/2015
4           xyz@xyz.com    Green             01/01/2014
5           xyz@xyz.com    Green             01/01/2014

示例2

ID          Email          Color             Date
6           abc@abc.com    Green             12/31/2014
7           abc@abc.com    Green             01/01/2014
8           abc@abc.com    Blue              01/31/2014

在示例1中,我想选择ID 2,因为这是重复电子邮件地址集中所需的最高颜色 - " Black" - 我选择的是具有最大值的日期(日期) )。

在示例2中,我想选择ID 8,因为这是重复电子邮件地址集中所需的最高颜色 - " Blue"。

1 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER()根据您的要求为每组重复的电子邮件中的每条记录分配优先级编号。然后,在外部查询中,您可以从具有最高优先级的每个组中选择记录:

SELECT ID, Email, Color
FROM (
SELECT ID, Email, Color,
       ROW_NUMBER() OVER (PARTITION BY email 
                          ORDER BY (CASE Color 
                                       WHEN 'Black' THEN 1 
                                       WHEN 'Blue' THEN 2 
                                       ELSE 3 
                                    END),                          
                                    Date DESC) AS rn
FROM emails ) e
WHERE e.rn = 1

SQL Fiddle Demo