Sql 消除名称稍有不同的行

Sql 消除名称稍有不同的行,sql,postgresql,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

我在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
我只想保留至少两个名字之间具有相似性的group phone+firstname。例如,在本例中,我想保留电话111和其中一个姓名,电话333保留重复Fred的姓名。电话222将被删除,因为所有的名字都不相似

结果数据将是

      fname         phone        
   John               111
   Fred               333
我遇到的问题是,当名字相似,但它有更多的名字,如约翰和约翰·詹姆斯,或者当名字被打错时,如约翰和约翰。我试着做了以下几点

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 

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

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 || '%'
                    )
             );
他是一名测试员

名称匹配是一项复杂的任务,不太适合SQL。然而,如果这是您所面临的问题,您可能需要研究Levenshtein距离和其他字符串相似性度量


注意:这将保留所有匹配的名称。如果每部手机只需要一行,您可以使用distinct on。

谢谢您的回答!名称是个问题,但我无法安装模块以使用Levenshtein。我想我在子查询中也可能有一个限制,因为我使用建议的代码收到了以下消息:“下的相关子查询表达式或不受支持”您知道使用类似代码获得相同结果的方法吗?@flaviodefalcoehelena。Postgres对这个查询没有任何问题。一个有效的例子现在链接到问题中。非常感谢。我改变了我正在使用的程序,它成功了。什么名字和你相似?四个名字被认为是相等的。最后两个不是