Устранить строки с именами, которые немного отличаются - PullRequest
0 голосов
/ 03 июня 2018

У меня в 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, сохраняя имя, которое повторяется (Фред).Телефон 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 

1 Ответ

0 голосов
/ 03 июня 2018

Определение подобия немного расплывчато, но это работает для данных, которые у вас есть в вопросе:

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.Однако вам может потребоваться изучить расстояние Левенштейна и другие метрики сходства строк, если вы столкнулись с этой проблемой.

Примечание. При этом сохраняются все совпадающие имена.Если вам нужна только одна строка для phone, вы можете использовать distinct on.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...