我在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
我遇到的问题是名称相似但名称更多(如约翰和约翰詹姆斯或名称错误,如约翰和乔恩)。我试图做以下事情
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 || '%'
)
);
Here是一个rextester。
名称匹配是一项复杂的任务,不太适合SQL。但是,如果这是您遇到的问题,您可能需要查看Levenshtein距离和其他字符串相似性指标。
注意:这会保留所有匹配的名称。如果你想要每个phone
只有一行,你可以使用distinct on
。