У меня есть таблица клиентов с несколькими сотнями тысяч записей. Есть много дубликатов различной степени. Я пытаюсь идентифицировать дубликаты записей с уровнем вероятности дублирования.
Моя исходная таблица имеет 7 полей и выглядит следующим образом:
Я смотрюдля дубликатов и поместите их в промежуточную таблицу с указанием уровня вероятности, имени таблицы и номера клиента. Промежуточная таблица
CREATE TABLE DataCheck (
id int identity(1,1),
reason varchar(100) DEFAULT NULL,
tableName varchar(100) DEFAULT NULL,
tableID varchar(100) DEFAULT NULL
)
Вот мой код для идентификации и вставки:
-- Match on Company, Contact, Address, City, and Phone
-- DUPE
INSERT INTO DataCheck
SELECT 'Duplicate','CUSTOMER',tcd.uid
FROM #tmpCoreData tcd
INNER JOIN
(SELECT
company,
fname,
lname,
add1,
city,
phone1,
COUNT(*) AS count
FROM #tmpCoreData
WHERE company <> ''
GROUP BY company, fname, lname, add1, city, phone1
HAVING COUNT(*) > 1) dl
ON dl.company = tcd.company
ORDER BY tcd.company
В этом примере он будет вставлять идентификаторы 101, 102
Проблема заключается в том, когдаЯ выполняю следующий проход:
-- Match on Company, Address, City, Phone (Diff Contacts)
-- LIKELY DUPE
INSERT INTO DataCheck
SELECT 'Likely Duplicate','CUSTOMER',tcd.uid
FROM #tmpCoreData tcd
INNER JOIN
(SELECT
company,
add1,
city,
phone1,
COUNT(*) AS count
FROM #tmpCoreData
WHERE company <> ''
GROUP BY company, add1, city, phone1
HAVING COUNT(*) > 1) dl
ON dl.company = tcd.company
ORDER BY tcd.companyc
Этот проход затем вставит 101, 102 и 103. На следующем проходе телефон будет сброшен, и он вставит 101, 102, 103, 104. Следующий проход будет искатьтолько для компании, которая вставила бы все 5.
Теперь у меня есть 14 записей в моей промежуточной таблице для 5 записей.
Как добавить исключение, чтобы группы 2-го прохода в одной компании, адресе, Город, телефон, но разные имена и имена. Тогда он должен только вставить 101 и 103
Я рассмотрел добавление NOT IN (SELECT tableID FROM DataCheck), чтобы идентификаторы не добавлялись несколько раз, но на 3-м и 4-м проходах он может найти дубликат и ввести700 записей после строки это дубликат, так что вы теряете контекст этого дублирования.
Мой вывод использует:
SELECT
dc.reason,
dc.tableName,
tcd.*
FROM DataCheck dc
INNER JOIN #tmpCoreData tcd
ON tcd.uid = dc.tableID
ORDER BY dc.id
И выглядит примерно так, что немногосбивает с толку: