В настоящее время я пытаюсь найти потенциальных дублированных клиентов, созданных за последние 6 месяцев, которые соответствуют всем историческим клиентам в относительно большой (760 000+ строк) таблице. В моей ситуации 2 клиента классифицируются как одинаковые: значение DIFFERENCE 4 для имени и фамилии, разные идентификаторы клиентов и аналогичные DOB (либо клиент 1 DOB = клиент 2 DOB, либо клиент 1 DOB равен нулю, или клиент 2 DOB равен нулю). В настоящее время я пытаюсь достичь этого путем самостоятельного присоединения к таблице следующим образом:
SELECT *
FROM (SELECT * FROM Customer c WHERE c.Created >= DATEADD(MONTH, -6, GETUTCDATE())) c1
JOIN (SELECT * FROM Customer) c2 ON c1.CustomerID <> c2.CustomerID
WHERE (c1.DOB IS NULL OR c2.DOB IS NULL OR c1.DOB = c2.DOB)
AND DIFFERENCE(c1.FirstName, c2.FirstName) = 4
AND DIFFERENCE(c1.LastName, c2.LastName) = 4
Когда я удаляю условие DOB, запрос работает достаточно хорошо (около 2 или 3 секунды для выполнения); однако, как только я добавляю это условие обратно, запрос просто продолжает вращаться до тех пор, пока моей машине не хватит памяти. Запрос также работает хорошо (хотя и немного медленно), когда нулевые проверки DOB не включены (т. Е. Только фрагмент c1.DOB = c2.DOB
). Будем очень благодарны за любые советы о том, как я могу реорганизовать / оптимизировать этот запрос!