Запросы к базе данных для поиска потенциальных дубликатов на основе нескольких столбцов
У меня есть таблица в моей базе данных, где у меня есть около 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().