В большой базе данных пользователей со следующим форматом и примерами данных мы пытаемся идентифицировать дублированных людей:
id first_name last_name email
---------------------------------------------------
1 chris baker
2 chris baker chris@gmail.com
3 chris baker chris@hotmail.com
4 chris baker crayzyguy@crazy.com
5 carl castle castle@npr.org
6 mike rotch fakeuser@sample.com
Я использую следующий запрос:
SELECT
GROUP_CONCAT(id) AS "ids",
CONCAT(UPPER(first_name), UPPER(last_name)) AS "name",
COUNT(*) AS "duplicate_count"
FROM
users
GROUP BY
name
HAVING
duplicate_count > 1
Это прекрасно работает; Я получаю список дубликатов с номерами идентификаторов соответствующих строк.
Мы переназначим любые связанные данные, связанные с дубликатом, фактическому человеку (set user_id = 2 where user_id = 3
), затем удалим дублирующую строку пользователя.
Проблема возникает после того, как мы делаем этот отчет в первый раз, поскольку мы очищаем список после ручной проверки того, что они действительно являются дубликатами - некоторые НЕ являются дубликатами. Есть 2 Криса Бейкерса, которые являются законными пользователями.
Мы не хотим продолжать видеть Криса Бейкера в последующих повторяющихся отчетах до конца времени, поэтому я ищу способ пометить, что идентификатор пользователя 1 и идентификатор 4 НЕ являются дубликатами друг друга для будущих отчетов, но они могут дублироваться новыми пользователями, добавленными позже.
Что я пробовал
Я добавил поле is_not_duplicate
в пользовательскую таблицу, но затем, если новый дубликат "Крис Бейкер" будет добавлен в базу данных, это приведет к тому, что эта ситуация не будет отображаться в дублирующем отчете; is_not_duplicate
неправильно исключает один из аккаунтов. Мое утверждение HAVING
не будет соответствовать порогу > 1
до тех пор, пока не появятся два дубликата Криса Бейкера, плюс "настоящий", помеченный is_not_duplicate
.
Подытоженный вопрос
Как я могу встроить исключения в вышеупомянутый запрос без зацикливания результатов или нескольких запросов?
Подзапросы в порядке, но размер набора данных учитывает каждый запрос, и я бы хотел, чтобы решение было максимально быстрым.