SQL Server 2014-如何查找不同的记录
我有一个联系人列表,包括名字、姓氏和电子邮件地址。有些电子邮件地址有多个名字和姓氏。我更关心的是电子邮件地址。我只想知道那个电子邮件地址的名字 我的代码显然不起作用:SQL Server 2014-如何查找不同的记录,sql,sql-server,group-by,Sql,Sql Server,Group By,我有一个联系人列表,包括名字、姓氏和电子邮件地址。有些电子邮件地址有多个名字和姓氏。我更关心的是电子邮件地址。我只想知道那个电子邮件地址的名字 我的代码显然不起作用: SELECT Salutation , FirstName , LastName , EmailAddress FROM Contact --GROUP BY EmailAddress ---I know a Group by will surely help 我已经试过了 SELECT max(Salut
SELECT Salutation
, FirstName
, LastName
, EmailAddress
FROM Contact
--GROUP BY EmailAddress ---I know a Group by will surely help
我已经试过了
SELECT max(Salutation)
,max(FirstName)
,max(LastName)
,max(EMailAddress)
FROM Contact
WHERE EMailAddress NOT LIKE ''
GROUP BY EMailAddress
这很管用,但我想知道是否有更好的方法可以做到这一点。试试:
SELECT Salutation
, FirstName
, LastName
, EmailAddress
FROM Contact
WHERE EmailAddress IS NULL
OR ID IN
(SELECT MAX(ID)
FROM Contact
WHERE EmailAddress IS NOT NULL
GROUP BY EmailAddress)
这将为您提供为每个电子邮件地址添加的最后一个名称。如何定义顶级名称 对名称使用
max()
可以轻松返回混合名称的结果,例如,“Aaron Bertrand”和“Itzik Ben Gan”将返回“Itzik Bertrand”。如果你混合了称呼语,那么你总是会从“先生”和“夫人”那里得到“夫人”,这可能也不合适
使用和: 随附版本:
显然,该表没有ID列Msg 207,级别16,状态1,第6行列名“ID”无效@user1777929我只是用了“ID”b/c你没有列出ID列的真正名称。如果您有一个id列具有不同的名称,则只需使用该名称即可。如果您有LastEdit DateTime列,您也可以使用它。谢谢您的回答。这确实有帮助。如何定义顶级名称?对重复项中的名称使用
max()
,可以得到名称混合的记录。e、 “艾伦·伯特兰”和“伊兹克·本·甘”会让你成为“伊兹克·伯特兰”。如果你有混合的称呼,那么你总是会从先生和夫人那里得到“夫人”。非常感谢。我尝试了你的第一个代码,它成功了。@user1777929很乐意帮助你!
select top 1 with ties
Salutation
, FirstName
, LastName
, EmailAddress
from contact
where EmailAddress <> ''
order by row_number() over (
partition by EmailAddress
order by FirstName /* your 'top' criteria here, FirstName is a placeholder */
);
select distinct
x.Salutation
, x.FirstName
, x.LastName
, t.EmailAddress
from contact t
cross apply (
select top 1
i.Salutation
, i.FirstName
, i.LastName
from t as i
where i.EmailAddress = t.EmailAddress
order by i.FirstName
) as x
where t.EmailAddress <> ''
;with cte as (
select *
, rn = row_number() over (
partition by EmailAddress
order by FirstName
)
from contact
where EmailAddress <> ''
)
select
Salutation
, FirstName
, LastName
, EmailAddress
from cte
where rn = 1;
select
Salutation
, FirstName
, LastName
, EmailAddress
from (
select *
, rn = row_number() over (
partition by EmailAddress
order by FirstName
)
from contact
where EmailAddress <> ''
) s
where rn = 1;