2012-01-04 123 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已啓用事實上的重複出現,而不是阻止它們。我不認爲你需要另一個這樣的「唯一標識符」!