【问题标题】:use Soundex and Substring to be able to get potential duplicate values from DB使用 Soundex 和 Substring 能够从 DB 中获取潜在的重复值
【发布时间】:2018-01-03 08:57:39
【问题描述】:

我问了一个类似的问题 [Querying database to find potential duplicates based on multiple columns,得到了 SQL 大师 Gordon Linoff 的友好回答。

总而言之,我有大约 10 万条客户记录,但现在才发现可能有很多重复记录 - 在大多数情况下,名字和姓氏拼写错误。

这是戈登为我写的查询...

select t
from (select t.*,
         count(*) over (partition by soundex(fname), soundex(lname), dob) as cnt
  from t
 ) t
where cnt > 1
order by dob, fname, lname; 

而且效果很好 - 但是它似乎只能拉出非常接近的匹配。我试图将其更新为仅尝试匹配前三个字母,但它似乎做得并不好,它为我提供了具有相同 DOB 的更多记录,但是,名字/姓氏值不仅是前3个字母,而且基本上是混合匹配。

这就是我在 count(*) 行中尝试做的事情

 count(*) over (partition by substring(soundex(fname),0,3), substring(soundex(lname),0,3), dob) as cnt

但就像我说的那样,它不会精确匹配 3 个字符,所以我得到了诸如

之类的名字
Ana
Annette

有什么方法可以更新它,以便能够更深入地查找我的重复项,但只使用名字和姓氏的前 3 个字符,同时仍然使用 Soundex?或者可能不使用 Soundex?

【问题讨论】:

  • 另一种方法,请参阅stackoverflow.com/questions/653157/…
  • @rd_nielsen - 谢谢
  • 有一个 SQL 函数,多年前由 Keith Henry 创建,称为 DoubleMetaPhone。它比 SOUNDEX 好得多。不幸的是,代码字符太多,无法在此处发布,但 Google 搜索会很快找到。
  • 可以分享一些示例数据吗?

标签: sql sql-server-2012 substring soundex


【解决方案1】:

检查这个

;WITH cte(fn, ln, dob)
     AS (SELECT 'anna',
                'elizibeth',
                '2000-12-19'
         UNION ALL
         SELECT 'ann',
                'elizibeth',
                '2000-12-19'
         UNION ALL
         SELECT 'paul',
                'eliot',
                '2000-12-13'
         UNION ALL
         SELECT 'rindol',
                'eliot',
                '2000-12-13')
SELECT fn,ln,count(*)           
FROM   (SELECT Substring(fn, 1, 3) fn,
               Substring(ln, 1, 3) ln,
               dob
        FROM   cte)a 
group by  fn,ln

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2013-08-08
    相关资源
    最近更新 更多