我有以下sql数据:
ID Company Name Customer Address 1 City State Zip Date
0108500 AAA Test Mish~Sara Newa Claims Chtiana CO 123 06FE0046
0108500 AAA.Test Mish~Sara Newa Claims Chtiana CO 123 06FE0046
1802600 AAA Test Company Ban, Adj.~Gorge PO Box 83 MouLaurel CA 153 09JS0025
1210600 AAA Test Company Biwel~Brce 97kehst ve Jacn CA 153 04JS0190
AAA测试,AAA.Test和AAA测试公司被视为一家公司。
由于他们的数据很乱,我想要么这样做:
在这种情况下,AAA测试和AAA.Test将是AAA测试公司。
如果通过sql查询无法做到这一点,那么您的建议是什么,以便我们可以清理记录?数据库中有近100万条记录,很难手动清理它。
提前谢谢。
答案 0 :(得分:1)
我认为大多数数据库服务器都支持全文搜索功能,如果有的话,还有一些与全文搜索相关的功能支持Proximity。 例如,SqlServer中有一个Near函数,这里是它的文档https://msdn.microsoft.com/en-us/library/ms142568.aspx
答案 1 :(得分:1)
您可以分几个阶段进行清理。
将所有内容转换为大写字母,删除标点符号&空格,然后匹配前6到10个字符(使用自连接)。假设您的表名为“vendor”:添加两列“status”,“dupstr”,然后更新如下
/** Populate dupstr column for fuzzy match **/
update vendor v
set v.dupstr = left(upper(regex_replace(regex_replace(v.companyname,'.',''),' ','')),6)
;
在dupstr
列上添加索引,然后执行此类更新以识别“好”记录:
/** Mark the good duplicates **/
update vendor v
set v.status = 'keep' --indicate keeper record
where
--dupes to clean up
exists ( select 1 from vendor v1 where v.dupstr = v1.dupstr
and v.id != v1.id )
and
( --keeper has longest name
length(v.companyname) =
( select max(length(v2.companyname)) from vendor v2
where v.dupstr = v2.dupstr
)
or
--keeper has latest record (assuming ID is sequential)
v.id =
( select max(v3.id) from vendor v3
where v.dupstr = v3.dupstr
)
)
group by v.dupstr
;
可以优化上述SQL以将“dupe”状态添加到其他记录,或者您可以单独更新。
报告人类要审查的任何剩余部分匹配(即没有守门员记录的重复记录)
答案 2 :(得分:0)
您可以将SQL查询与DIFFRENCE的SOUDEX一起使用
例如: 选择差异(“ AAA测试”,“ AAA测试公司”)
DIFFERENCE返回0-4(4 =几乎相同,0-完全不同)
另请参阅:https://docs.microsoft.com/en-us/sql/t-sql/functions/difference-transact-sql?view=sql-server-2017