我一直在讨厌这个问题,但似乎无法让它发挥作用。我认为需要一些可能超出我的其他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,但我似乎无法绕过所有名称返回。
非常感谢任何帮助!
谢谢。
丹尼斯
答案 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子句以满足您的需要。
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关键字可能正是您要找的。 p>