Sql 消除名称稍有不同的行
我在POSTGRESQL中有一个带有UUID、名字fname和电话的数据库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
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对这个查询没有任何问题。一个有效的例子现在链接到问题中。非常感谢。我改变了我正在使用的程序,它成功了。什么名字和你相似?四个名字被认为是相等的。最后两个不是