在SQL中选择第一个唯一的电子邮件地

时间:2011-06-29 08:18:28

标签: sql sql-server-2008

我有一个UserIds列表(这是一个uniqueidentifier),名称,电子邮件地址和关系。

这样的东西
SELECT UserId, Name, Email, Relationship FROM Users

示例数据如下所示:

F87B7702-F0EE-11D3-B288-0000B4A488D3  Peter peter@peter.com Member
ZZZZZZZZ-F0EE-11D3-B288-0000B4A488D2  Joan  peter@peter.com Principal
AAAAAAAA-F0EE-11D3-EEEE-0000B4A488D3  Bob   bob@bob.com     Principal

关系可以是'Principal'或'Member',但主要用户也可以是成员。

电子邮件地址并非特定于用户(通常会员用户将拥有与主要用户相同的电子邮件地址)。

我需要确保每个电子邮件地址只选择1个用户,这样同一个人就不会通过电子邮件发送两次。如果同一用户有2封电子邮件,我需要选择主要记录。

最简单的方法是什么,记住你不能在uniqueidentifier字段上做最大值?对于我上面给出的样本数据,我只需要返回第二和第三条记录。

我倾向于按照关系排序,按照然后最大限度地进行分组,但我不认为这是可能的。

所需输出为UserId,Name,Email。

2 个答案:

答案 0 :(得分:3)

ROW_NUMBER()中的ORDER BY将允许您选择如何确定电子邮件的优先级。比如如何处理没有原则但只有多个成员的电子邮件(可能会添加, Name ASC,以便选择具有第一个按字母顺序排列的名称的成员?)

SELECT
  *
FROM
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY email ORDER BY Relationship DESC) AS sequence_id
  FROM
    yourTable
)
  AS sequenced_table
WHERE
  sequence_id = 1

答案 1 :(得分:0)

我不是很了解你,但是如果你只想收到一次电子邮件,那么这个代码会对原则用户产生影响:

select UserId, Name, Email, Relationship
from Table
where Relationship='Principle' or ( Relationship='Member' and Email not in
(
select Email
from Table
where Relationship='Principle'
)
)

这将为您提供第二行和第三行。如果有更多条件,请扩展您的示例。