消除名称略有不同的行

时间:2018-06-03 16:38:02

标签: sql postgresql

我在POSTGRESQL中有一个带有UUID,名字(fname)和电话的数据库

  uuid  fname             phone        
    1   JOHN               111
    2   john               111
    3   John               111
    4   JOHN JAMES         111
    5   Charles            222
    6   Peter              222
    7   James              222
    8   Jimmy              222
    9   Fred               333
    10  Fred               333
    11  Greg               333

我想只保留至少两个名字之间具有相似性的群组电话+名字。因此,例如,在这种情况下,我想保持电话111和其中一个名称和电话333保持重复的名称(Fred)。电话222将被删除,因为所有名称都不相似。

结果数据为

      fname         phone        
   John               111
   Fred               333

我遇到的问题是名称相似但名称更多(如约翰和约翰詹姆斯或名称输入错误时,如John和Jonh)。我试过以下

SELECT
    m1.phone,
    m1.fname, 
    m1.uuid
FROM
    master as m1 
    JOIN master as m2 on m1.uuid = m2.uuid
WHERE
    m1.phone = m2.phone 
    and m1.fname ILIKE m2.fname
ORDER BY 1 

1 个答案:

答案 0 :(得分:0)

相似性的定义有点模糊,但这适用于您在问题中的数据:

select m.*
from master m
where exists (select 1
              from master m2
              where m2.phone = m.phone and m2.uuid <> m.uuid and
                    (m.fname ilike '%' || m2.fname || '%' or
                     m2.fname ilike '%' || m.fname || '%'
                    )
             );

Here是rextester。

名称匹配是一项复杂的任务,不太适合SQL。但是,如果这是您遇到的问题,您可能需要查看Levenshtein距离和其他字符串相似性指标。

注意:这会保留所有匹配的名称。如果每phone只需要一行,则可以使用distinct on