2012-01-04 79 views
2

我一直在做很多研究,但是我一直无法找到一种方法来做我想做的事。考虑下表:Microsoft SQL - 识别重复项并分配唯一标识符

| 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

如果你使用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

我们回答同样的问题:) – 2012-01-04 07:14:39

+0

非常感谢您的帮助。你的解决方案完美运作:) – user1129284 2012-01-06 03:27:07

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 
1

你已经拥有即OrderNumberZIP以及化合物的唯一标识符PhoneNumber

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