2015-01-14 35 views
4

情況
在Microsoft SQL Server 2008上,我有大約200萬行。 (這應該從未發生過,但我們繼承了這種情況)。一個示例如下:SQL查找重複項並指定組號

usernum. | phone | email 
1  | 123 | [email protected] 
2  | 123 | [email protected] 
3  | 245 | [email protected] 
4  | 678 | [email protected] 

目的
我想創建一個表,看起來像這樣。這個想法是,如果'電話'或'電子郵件'是相同的,他們被分配相同的組號碼。

groupnum |usernum. | phone | email 
1  | 1  | 123 | [email protected] 
1  | 2  | 123 | [email protected] 
2  | 3  | 245 | [email protected] 
2  | 4  | 678 | [email protected] 

試過到目前爲止
到目前爲止,我已經創建了一個簡單的Python腳本,在概念上執行以下操作:
- 每個usernum在表
- 指定一組號碼
- 還要將組號碼分配給電話或電子郵件與此行相同的所有行
- 如果usernum已經處理,請不要指定組號(否則我們會做雙倍處理)

問題
python腳本基本上必須檢查每行是否有重複的電話或電子郵件。雖然這對於大約10,000條記錄來說是完全正確的,但對於2百萬條記錄而言太慢了。我認爲這可能在t-sql中完成,這應該比使用pyodbc的python腳本快得多。
因此,最大的問題是,如何在sql中做到這一點。

回答

1

只是注意到你說的電子郵件電話是重複的。爲此,我認爲你需要決定哪個用戶可以從任何一個字段加入的情況下哪個優先。或者你可能僅僅是更新分成幾批基於電話和電子郵件,然後電子郵件(如果尚未匹配),然後電話時(尚未匹配),這樣使組數字:

insert into yourGroupsTable (phone, email) -- assuming identity column of groupNum here 
select distinct phone, email 
from yourUserTable 

-- assign group nums with priority on matching phone AND email 
update yourUserTable 
set groupNum = g.groupNum 
from yourUserTable u 
join yourGroupsTable g on u.phone = g.phone 
    and u.email = g.email 

它現在發生這種情況,因爲不同的選擇,這將不起作用,因爲每行都會加入yourGroupsTable。我跨我不能確定你的預計結果將是什麼(太大評論)的情景來 - 什麼在這種情況下發生的:

您的測試數據略作修改:

groupnum |usernum. | phone | email 
1  | 1  | 123 | [email protected]al.com 
1  | 2  | 123 | [email protected] 
?  | 3  | 245 | [email protected] 
?  | 4  | 678 | [email protected] 
?  | 5  | 245 | [email protected] 
?  | 6  | 678 | [email protected] 

會是什麼麻木在上述情況下?

0

當你這樣做的Python腳本是好辦法...如果你想使用MySQL移動插入記錄必須檢查它之前就存在一個程序或不表

是否存在 然後得到該行groupnum,使它將該groupnum分配給這個新記錄... 如果沒有 然後給新groupnum

,但我還是有點慌亂

現在如果記錄是像

5 | 678 | [email protected]

如果是這樣的話?

我假設列[電話和電子郵件]都考慮給團體。

如果我的假設是正確的,那麼去mysql程序...