Microsoft SQL - 识别重复项并分配唯一标识符

时间:2012-01-04 07:02:24

标签: sql sql-server

我一直在做很多研究,但我找不到办法去做我想做的事。请考虑下表:

| PK     |  OrderNumber  |  ZIP         |   PhoneNumber
| 1111   |  11-11        |  11111       |   111-111-1111 
| 2222   |  22-22        |  22222       |   222-222-2222 
| 3333   |  33-33        |  33333       |   333-333-3333 
| 4444   |  44-44        |  44444       |   444-444-4444
| 5555   |  11-11        |  11111       |   111-111-1111 
| 6666   |  22-22        |  22222       |   222-222-2222 
| 7777   |  33-33        |  33333       |   333-333-3333 
| 8888   |  44-44        |  44444       |   444-444-4444
| 9999   |  99-99        |  99999       |   999-999-9999 

有没有办法找到所有重复项并为每个组分配唯一标识符?这就是我想看到的:

| DuplicateID | PK     |  OrderNumber  |  ZIP         |   PhoneNumber     
|  1          | 1111   |  11-11        |  11111       |   111-111-1111 
|  1          | 5555   |  11-11        |  11111       |   111-111-1111 
|  2          | 2222   |  22-22        |  22222       |   222-222-2222 
|  2          | 6666   |  22-22        |  22222       |   222-222-2222  
|  3          | 3333   |  33-33        |  33333       |   333-333-3333 
|  3          | 7777   |  33-33        |  33333       |   333-333-3333 
|  4          | 4444   |  44-44        |  44444       |   444-444-4444 
|  4          | 8888   |  44-44        |  44444       |   444-444-4444
|  5          | 9999   |  99-99        |  99999       |   999-999-9999 

我知道如何查找所有重复项并将它们放在#Temp表中,但我不知道如何为每个组分配唯一标识符。

我提前为我的桌子道歉,我想发布一张图片,但显然我需要超过“10”的声誉才能做到这一点。

感谢您提供的任何帮助

3 个答案:

答案 0 :(得分:3)

如果您使用SQL Server 2005或更高版本,则可以使用dense_rank()

select dense_rank() over(order by OrderNumber, ZIP, PhoneNumber) as DuplicateID,
       *
from YourTable

如果您想要更新表格中有DuplicateID列,则可以这样做:

;with C as
(
  select DuplicateID,
         dense_rank() over(order by OrderNumber, ZIP, PhoneNumber) as rn
  from YourTable
)
update C
set DuplicateID = rn

答案 1 :(得分:2)

select 
   dense_rank() over (order by OrderNumber , ZIP, PhoneNumber) as DuplicateID,
   pk,
   OrderNumber , 
   ZIP, 
   PhoneNumber,
   row_number() over (partition by OrderNumber , ZIP, PhoneNumber) as nth_duplicate
from your_table

答案 2 :(得分:1)

您已拥有唯一标识符,即OrderNumberZIPPhoneNumber的组合。

假设所谓的“唯一标识符”PK已启用启用事实上的重复项,而不是阻止它们。我认为你不需要另一个这样的“唯一标识符”!