Поиск похожих имен в нескольких таблицах - PullRequest
3 голосов
/ 29 июня 2010

У меня есть несколько таблиц с разными именами клиентов.Я пытаюсь выяснить, сколько раз одно и то же имя в таблице.Проблема в том, что кто-то мог ввести имя как «Джон Смит» или «Смит, Джон».

В каждой таблице 40 000 строк и более 40 разных таблиц.Я пытаюсь сделать запрос, не зная имен, но все равно возвращаюсь как имена.

По сути, мне нужно сгруппировать похожие имена без использования таких выражений, как:

WHERE cust_name LIKE '%john%'

Как можно запрашивать несколько столбцов таблицы, используя содержимое других столбцов таблицы, когда данные внутри могут отсутствоватьтот же формат?Как бы вы лучше «очистили» данные, чтобы удалить запятые, пробелы и т. Д.?

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

У вас есть нечеткая логика, доступная в SSIS.Я использовал нечеткое группирование успешно, чтобы найти дубликаты - хотя вы захотите сопоставить больше, чем имя, так как многие люди имеют одинаковые имена.Я сделал матч, используя имя, адрес, телефон и электронную почту.Нечеткая группировка позволяет использовать несколько полей для сопоставления.

1 голос
/ 29 июня 2010

Это действительно не проблема с базой данных. Настоящая проблема - придумать алгоритм, который будет принимать имя и преобразовывать его в стандартный формат. Это трудно сделать и зависит от того, как выглядят ваши исходные данные. Я хотел бы просмотреть ваши исходные данные и попытаться найти некоторые шаблоны для поиска, а затем использовать обычные манипуляции со строками, чтобы изменить их все в один и тот же формат.

0 голосов
/ 29 июня 2010

Сопоставление имен может быть очень сложным делом. Вам нужно не только беспокоиться о «Джоне Смите» против «Смита, Джона», но и о Кэтрин против Кэтрин против Кейт против Кэти против Кэти. Я уверен, что для подобных целей существуют сторонние решения для интеллектуального анализа данных, хотя я не могу порекомендовать ни одного.

Если вы знаете, что ваши имена только в форме «FirstName LastName» и «LastName, FirstName», то вы можете попробовать что-то вроде этого:

SELECT
    CASE
        WHEN name LIKE '%,%'
            THEN SUBSTRING(name, CHARINDEX(',', name) + 2, LEN(name)) + ' ' +
                 SUBSTRING(name, 1, CHARINDEX(',', name) - 1)
        ELSE name
    END AS name

Строковые функции могут зависеть от вашей конкретной СУБД. Кроме того, это довольно хрупко. Он опирается на точный формат с пробелом после столбца и т. Д. Вам нужно настроить его, если вы хотите лучше.

Я бы также посоветовал вам добавить представление о сорока таблицах как UNION ALL, чтобы вы могли работать со всеми ними одновременно. Может быть, что-то жестко закодировать в представлении, чтобы вы знали, из какой таблицы пришла каждая строка.

Наконец, вы можете изучить использование soundex, но реализовать его может быть сложно, если у вас нет опыта работы с ним.

...