确保在SQL Server中返回多个数据时只记录1条记录

时间:2013-12-30 16:56:15

标签: sql sql-server

我一直在讨厌这个问题,但似乎无法让它发挥作用。我认为需要一些可能超出我的其他SQL Server功能或标准才能使其正常工作。

我有这个样本数据集:

Test1@gmail.com FirstName LastName
Test1@gmail.com DiffFirstName DiffLastName
MyOtherEmail@gmail.com Jane Doe
MyOtherEmail@gmail.com John Doe
MyOtherEmail@gmail.com Jack Doe

我需要的是,只返回第一行的数据是电子邮件是重复的,另一个是丢弃的,因为我们不需要它。所以,这将是选定的回报集:

Test1@gmail.com FirstName LastName
MyOtherEmail@gmail.com Jane Doe

我正在尝试分组,Over,Partition By和Temp Tables,但我似乎无法绕过所有名称返回。

非常感谢任何帮助!

谢谢。

丹尼斯

4 个答案:

答案 0 :(得分:3)

你走了。您甚至不需要修改表结构(尽管您仍然可能想要)。

SELECT Email, FirstName, LastName FROM (
    SELECT Email, FirstName, LastName,
        ROW_NUMBER() OVER(PARTITION BY Email ORDER BY LastName) AS RowNum
    FROM Table1
) a
WHERE a.RowNum = 1;

ORDER BY内的PARTITION将确定哪条记录浮动到顶部。我使用LastName排序。把它改成你想要的任何东西。

答案 1 :(得分:1)

使用ROW_NUMBER() with PARTITION BY and ORDER BY。修改ORDER BY子句以满足您的需要。

SQLFiddle

WITH contacts as (
  SELECT ROW_NUMBER() OVER(PARTITION BY email ORDER BY first_name) AS row,
         email, first_name, last_name
  FROM contact
)
SELECT * FROM contacts where row = 1;

Ellesedil's answer类似,只是使用CTE而不是子查询。请注意答案here中提到的差异。

答案 2 :(得分:0)

在表格中添加一个int ID 把它作为你桌子的PK 无论如何,任何表都需要一个PK而你 PK没有合适的专栏。

然后做这样的事情。

select t1.* from
TableName t1
inner join 
(
    select t0.email, min(t0.id) as id 
    from TableName t0
    group by t0.email
) t2 on t1.id = t2.id 

答案 3 :(得分:0)

我认为DISTINCT关键字可能正是您要找的。