2014-03-06 425 views
4

我已經搜索了問題,但也有類似的問題,但沒有解決方案,我想我可以使用。這個問題類似於模糊匹配... sorta。我需要比較兩個表格的幫助。一張表是公司參考表,另一張表是每天將原始公司數據導入其中的表格。參考表是乾淨的,並且每個公司都有一個公司ID。導入的每日數據沒有公司標識。我想要做的是讓每日數據參考company_name上的「公司參考表」,並根據company_name更新「公司表」列company_state。不幸的是,每天進入company_name的每日數據字符串並不總是相同。可以有不同的字符(a-z,0-9,+, - ,。)和空格在實際公司名稱前面或後面,每天不同的長度,所以我不相信我可以使用charindex來清理它。SQL - 比較兩個表中的字符串(模糊匹配... sorta)

公司參考表

company_id company_name company_state 
1   Awesome Inc NY 
2   Excel-guru AL 
3   Clean All  MI 

公司表

company_name    company_state 
abc123 Awesome Inc  NULL 
Excel gur xyz-987   NULL 
Clean All Cleanall  NULL 

我希望它做的是什麼。 Sorta就像模糊匹配。

公司表

company_name    company_state 
abc123 Awesome Inc  NY 
Excel gur xyz-987   AL 
Clean All Cleanall  MI 

任何幫助深表感謝。謝謝。

+1

我不認爲你可以在數據庫級別處理這個問題:/ –

回答

1

嘗試下面的查詢更新公司表:

update company c INNER JOIN company_ref cr 
ON c.company_name LIKE concat('%', cr.company_name, '%') 
SET c.company_state = cr.company_state; 

另一種方法只是通過選擇

SELECT c.*, cr.* FROM company c INNER JOIN company_ref cr 
ON c.company_name LIKE concat('%', cr.company_name, '%'); 

SQL小提琴:http://sqlfiddle.com/#!2/ec76f/1

+0

這只是可能的工作。我注意到它不適用於'Excel guru xyz-987',因爲引用是'Excel-guru',因此破折號將其混淆。也許,一個數據清理(擺脫所有非字母數字字符),然後運行此更新將工作。請嘗試一下,讓你知道結果。謝謝一堆! – blu

+0

我今天沒有進行數據清理測試,它對大約70%的記錄起作用。我認爲事先做好一些數據清理工作並做更多工作,這將成爲我的解決方案。另外,我不得不修改腳本以使用T-SQL。我相信你在使用MYSQL,如果我錯了,請糾正我。這是我的更新聲明:'更新c設置c.company_state = cr.company_state從公司c內部聯接company_ref cr c.company_name像concat('%',cr.company_name,'%')' – blu

+0

@blu:是,我使用MySQL,我很高興我可以幫助你。 – kwelsan

0

如果我明白了,公司表中的company_name總是包含參考表中的整個字符串 - 它可能在該字符串之前或之後包含一些垃圾。如果是這樣,你只需要找到適合您的DBMS適當的字符串函數,可以讓你檢查,如果字符串A包含字符串B.例如,與MySQL我覺得下面的工作(未測試):

select c.company_name, r.company_state from company_table c, reference_table r where locate(r.company_name, c.company_name) != 0

是可行的,因爲MySQL的locate(A, B)函數返回0,當且僅當字符串是一個不串B.發生

+0

實際上,傳入的數據不是這樣的。如果是這樣,它會簡單得多。例如,傳入的company_name可能是'123 Clean A'。這應該與「全部清理」相匹配,但因爲它缺少「全部」中的「全部」,所以不會找到它,並且這會因每個公司名稱而異。 – blu

0

因爲輸入數據不統一的格式,我不認爲你將能夠與一個做到這一點數據庫。事實上,我建議不要用數據庫來做,這樣可以事先運行匹配的例程。

然後,您需要檢查儘可能多的數據,並查看是否可以找到任何模式,或者您可以對數據進行批量操作以便更容易匹配。例如:

  • 刪除重複的空格(例如,「Awesome Inc」 - >「Awesome Inc」)
  • 刪除非字母數字字符
  • 如果可能,您是否可以刪除明顯的代碼?

然後,我會建議類似下面的東西:

  • 一個字段添加到您的公司表(輸入的數據)來指示匹配的公司,讓您保持匹配項目的跟蹤(和進一步用於連接)。如果您不想修改此表格,請添加第二個表格以鏈接這兩個表格。
  • 運行重複嘗試匹配,從最確定的版本開始(例如,公司表中的狀態存在且國家匹配公司表名中的公司表名) - 存儲這些關聯。他們會減少您下次嘗試的可能匹配。在任何情況下,你的匹配返回> 1的可能性,它不應該被使用。
  • 當您消除簡單匹配時,可以繼續使用更多模糊方法,例如Levenshtein Distance,單個詞(令牌)匹配。

我希望有一段時間,您應該標記出低信度的匹配,讓人類對它們進行審閱,同時調整過程。

您還可以存儲公司以前的所有匹配項,這意味着隨着時間的推移,您的系統可能會變得更好。這取決於每天的數據量有多少。