我在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
答案 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
。