Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2014-如何查找不同的记录_Sql_Sql Server_Group By - Fatal编程技术网

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;