消除名称略有不同的行

问题描述 投票:0回答:1

我在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 
sql postgresql
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.