Запросы к базе данных для поиска потенциальных дубликатов на основе нескольких столбцов

У меня есть таблица в моей базе данных, где у меня есть около 100 тыс. Клиентов и с ошибочной системой, которая существовала в течение достаточно долгого времени, мы просто пришли к выводу, что у нас могут быть тысячи дублированных записей, которые не должны были быть дубликатами.

Это основная структура таблицы...

ClientID         FName           LName           DOB          SysEMID
----------------------------------------------------------------------
123              Janette         Marukan         1/2/1990     111111S
478              Jannete         Maruckan        1/2/1990     111111S

Это не все поля в системе, но моя цель - использовать приведенные выше столбцы в моем поисковом запросе. Поэтому я пытаюсь взять первые 2 или 3 буквы имени и фамилии, DOB, а также SysEMID и найти все записи, которые могут быть потенциальными дубликатами.

Как видно из таблицы выше, у меня есть два клиента, но их имена немного отличаются - на самом деле оба клиента одинаковы, но они сохраняются в системе как два. Есть ли способ для меня, чтобы как-то запросить целые таблицы и найти это?

У меня действительно нет 1 конкретного клиента на месте - это скорее общий вид запроса, чтобы показать мне потенциальные дубликаты клиентов с одинаковыми 2 или 3 буквами первого имени, фамилии и DOB для начинающих?

4 ответа

Решение

Вы бы использовали оконные функции:

select t
from (select t.*,
             count(*) over (partition by left(fname, 2), left(lname, 2), dob, sysemid) as cnt
      from t
     ) t
where cnt > 1
order by sysemid, dob, fname, lname;

Это также может быть одной из тех редких ситуаций, когда soundex() на самом деле полезно. В конце концов, это было разработано с учетом требований. Так:

select t
from (select t.*,
             count(*) over (partition by soundex(fname), soundex(lname), dob, sysemid) as cnt
      from t
     ) t
where cnt > 1
order by sysemid, dob, fname, lname;

Как это:

SELECT LEFT(FName,2) AS FN, LEFT(LName,2) AS LN, DOB, COUNT(*)
FROM YourTable
GROUP BY LEFT(FName,2), LEFT(LName,2), DOB
HAVING COUNT(*) > 1
;

Я полагаю, что вы решили проблему с новыми данными, но для старых данных вы можете сделать следующее:

1) Сделайте точное сравнение, которое даст вам очень точные дубликаты. Это легкая часть.

2) Для похожих строк, например, Josh и Joshh, вам нужно либо использовать некоторый код, который вам нужно написать, чтобы проверить расстояние между двумя строками, либо более простой способ, если вам нравится кодирование только в SQL, это использовать функцию DIFFERENCE. это даст вам значение 0-4, где 4 означает, что строки очень похожи. Плохая вещь в этом - вы должны быстро взглянуть на них, чтобы убедиться, что все хорошо. Для получения дополнительной информации https://technet.microsoft.com/en-us/library/ms189282(v=sql.105).aspx

3) Я предпочитаю, чтобы вы пошли, открыли Visual Studio или предпочитаемую IDE, подключились к вашей базе данных, выбрали все данные в таблице, занесли их в память и внедрили хорошую функцию расстояния до строки.

Там нет волшебной пули, встроенной в SQL Server. Вам придется определиться с вашими бизнес-правилами и кодировать их.

Например, если вы решили искать совпадения в первых 3 буквах имени, используйте функцию LEFT(), чтобы получить первые 3 буквы. Чтобы просмотреть отдельные части DOB, вы можете использовать функцию DATEPART().

Другие вопросы по тегам