如何在SQL Server中获取包含第一行编号的重复行?

4
我已经编写了如下查询语句,使用 SQL Server 中的 Row_Number() 函数来检索重复的客户。
 Cust_PKID ---------------+ CustomerID ----------------- + MobileNo
 1                        | A00001                       | 9000477444   
 2                        | A00002                       | 9000477444
 3                        | A00003                       | 9000477444

查询:

Select TMP.CustID
From
(
   Select CustomerID CustID,
       Row_Number() Over(Partition By MobileNo Order By (Select Null)) As RowNo
   From dbo.Customers
) TMP
Where TMP.RowNo > 1

输出:

Cust_PKID ---------------+ CustomerID ----------------- + MobileNo    
2                        | A00002                       | 9000477444
3                        | A00003                       | 9000477444

如何在单个选择语句中检索包括第一个RowNo记录的记录?

无法使用单个选择,您必须使用函数/子查询,并且其中始终选择语句。 - Sandip - Frontend Developer
1个回答

4
您正在寻找窗口函数COUNT() OVER()而不是ROW_NUMBER
Select TMP.CustID
From
(
   Select CustomerID CustID,
       COUNT(1) Over(Partition By MobileNo) As RowNo
   From dbo.Customers
) TMP
Where TMP.RowNo > 1

这将会呈现所有重复的MobileNo记录。

以上查询需要更长的执行时间。客户表中有近1000万条记录。我已经为该表创建了适当的索引。以前我使用了带有Having Count(*)查询的Group By语句。它也需要更长的执行时间。 - RGS
你在哪个列上建立了索引?它被使用了吗? - Pரதீப்
我在“顾客”表中的“移动电话”和“客户编号”上建立了索引。 - RGS
@RGS - 我在索引方面不太擅长,但给我更多信息,比如它是非聚集索引还是聚集索引?或者你是否为这两列分别创建了索引? - Pரதீப்
两者都是独立的非聚集索引。我会调查执行计划。谢谢。 - RGS
@RGS - 我认为索引不会有用,因为它必须扫描所有记录,我也会尝试我的方法。 - Pரதீப்

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接