如何清理sql

时间:2015-04-22 14:52:07

标签: sql

我有以下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测试公司被视为一家公司。

由于他们的数据很乱,我想要么这样做:

  1. 有没有办法搜索数据库中的所有记录,它会用几乎相同的名称搜索公司名称,然后将其重命名为最长名称?
  2. 在这种情况下,AAA测试和AAA.Test将是AAA测试公司。

    1. 或者是否有办法过滤只有公司名称几乎相同的记录,然后他们可以选择更改它?
    2. 如果通过sql查询无法做到这一点,那么您的建议是什么,以便我们可以清理记录?数据库中有近100万条记录,很难手动清理它。

      提前谢谢。

3 个答案:

答案 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”状态添加到其他记录,或者您可以单独更新。

清理Stragglers

报告人类要审查的任何剩余部分匹配(即没有守门员记录的重复记录)

答案 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