如何获取除使用Groupby和RowNo之外的所有记录?

时间:2017-04-05 05:36:31

标签: sql-server

我正在使用SQL Server,我需要更新除一条记录(有效)之外的所有重复记录(无效)。

我不知道为什么我的查询没有返回rowno - 我总是得到1:

select *
from TABLE_NAME
inner join 
    (select  
         Contact_EmailID,
         ROW_NUMBER() OVER (partition by Contact_EmailID order by Contact_EmailID) RN,
         COUNT(*) AS COUNTM
     from 
         TABLE_NAME
     group by 
         Contact_EmailID
     having  
         Contact_EmailID != '') as EmailDet On EmailDet.Contact_EmailID = TABLE_NAME.Contact_EmailID
where 
    EmailDet.COUNTM > 2 

我想要RN大于1的所有记录,以便我可以更新它们。

3 个答案:

答案 0 :(得分:1)

您可以像这样使用GROUP BY

select *
from TABLE_NAME
inner join 
(
    SELECT  Contact_EmailID             
    FROM TABLE_NAME
    WHERE Contact_EmailID !=''
    GROUP BY Contact_EmailID
    HAVING COUNT(*) > 1
) as EmailDet
On EmailDet.Contact_EmailID=TABLE_NAME.Contact_EmailID

答案 1 :(得分:1)

请尝试......

SELECT *
FROM
(
    SELECT *,
           ROW_NUMBER() OVER ( PARTITION BY Contact_EmailID ORDER BY Contact_EmailID ) AS rowNum
    FROM table_name
) tempTable
WHERE tempTable.rowNum > 1;

内部SELECT语句应在每个记录旁边放置一个行号,该记录在电子邮件地址组中是唯一的。然后,您应该可以选择要执行或不希望访问的行,例如使用外部SELECT语句。

注意:在没有任何合适的测试数据的情况下,我无法对此进行测试,但我希望在源列表未排序的情况下,它将继续每个ID的序列,而不是每当ID重新启动时即使之前遇到当前ID,也与先前的ID不同。如果确实发生了这个问题,请尝试...

SELECT *
FROM
(
    SELECT *,
           ROW_NUMBER() OVER ( PARTITION BY Contact_EmailID ORDER BY Contact_EmailID ) AS rowNum
    FROM table_name
    ORDER BY Contact_EmailID
) tempTable
WHERE tempTable.rowNum > 1;

如果您有任何问题或意见,请随时发表评论。

答案 2 :(得分:0)

选择重复行的

我使用以下查询

SELECT * FROM 
    (
    select ID,Contact_Name,Contact_EmailID,
    ROW_NUMBER() over(partition by Contact_EmailID order by Contact_EmailID) RN
    FROM AtsTool_ContactDetails 
    WHERE Contact_EmailID != '' and EmailVerifiedResponce='valid'
    )T 
    WHERE RN>1

在选择查询

上更新UNIQUE EMAIL
;with DeleteDuplicate AS
(
select ID,Contact_Name,Contact_EmailID, Status, EmailVerifiedResponce, 
ROW_NUMBER() over(partition by Contact_EmailID order by Contact_EmailID) RN
FROM AtsTool_ContactDetails 
WHERE Contact_EmailID != '' and EmailVerifiedResponce = 'valid'
)

UPDATE DeleteDuplicate SET [Status] = 0, EmailVerifiedResponce = 'invalid' WHERE RN>1   

因此,从上面的更新查询中,只有单个条目的电子邮件可用,其他条目更新为status = 0。