如何编写Sql查询以从重复行中检索一行?

时间:2015-06-10 15:21:41

标签: sql sql-server sql-server-2008

我有一个User表,其中包含许多用户,但有些用户具有相同的名字和姓氏,但只有一个用户的状态有效。所以我的要求是如果用户是唯一的,我需要用户而不管状态如何,但如果用户是重复的,我需要状态有效的记录。 我怎样才能在SQL服务器中实现这一点? 抱歉,这里的混淆是用户表

的例子

enter image description here

我的结果表应该是

enter image description here

史蒂夫乔丹在这里有2条记录,所以我需要状态为1的记录 对于具有不同名字和姓氏的记录,我需要所有记录都考虑较少的状态。

注意:我有一个用户ID作为主键,但我加入了名字和姓氏,因为其他表没有用户ID。

3 个答案:

答案 0 :(得分:0)

理想情况下,您应该在两个表中都有用户ID PK,因为这在关系上要强得多。

编辑:有点复杂,但这应该会给你你想要的东西。

SELECT *
FROM YourOtherTable A
JOIN Users B
ON A.FirstName = B.FirstName AND A.FirstName = B.FirstName 
LEFT JOIN
(
    SELECT FirstName, LastName FROM User GROUP BY FirstName, LastName HAVING COUNT(FirstName) = 1
) C
ON B.FirstName = C.FirstName AND B.LastName = C.LastName
WHERE B.Status = 1 OR C.FirstName IS NOT NULL

答案 1 :(得分:0)

我没有问你问题。但是,根据您的主题。如果记录重复,您似乎想要记录active

select T.* from yourTable T INNER JOIN (select user, count(*) cnt FROM yourTable GROUP BY user) A ON A.user=T.user
WHERE A.cnt>1 and T.status='A'; 

如果不是您的要求。然后,我会要求您分享您的表结构和预期输出以便更好地理解。

答案 2 :(得分:0)

SELECT UserId, FirstName, LastName, Status FROM (
    SELECT *
    , ROW_NUMBER() OVER (PARTITION BY FirstName, LastName
                         ORDER BY Status DESC) AS rowNum
    FROM [User]
) u
WHERE u.rowNum = 1

这实际上按名字和姓氏分组,按状态排序,以便活动具有更高的优先级,并且只接受每个唯一的名/姓名组合中的一个。这可以确保每个唯一的名字/姓氏组合仅在结果集中一次,如果有多个,则活动的是返回的。如果名称组合具有倍数,但它们都未激活,则只返回一个,任意选择。