Как проверить наличие дублей по атрибуту в таблице SQL
Что проверяют
Базовый SQL плюс понимание, что такое дубль в ваших данных. Интервьюеру важно, спросите ли вы, по какому ключу считать повтор и как быть с NULL и регистром. Следом почти всегда просят не только найти дубли, но и удалить их, оставив одну запись.
Как отвечать
Начните с классики и сразу покажите, что знаете альтернативы:
- группировка:
SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1. Показывает значения-дубли и сколько раз они встречаются; - быстрая проверка: сравнить
COUNT(*)иCOUNT(DISTINCT email). Если числа разошлись, дубли есть. Удобно как ассерт в пайплайне; - оконная функция:
ROW_NUMBER() OVER (PARTITION BY email ORDER BY updated_at DESC). Строки с номером больше 1 лишние, и этот же запрос служит основой для дедупликации с сохранением свежей версии; - составной ключ: дубль часто определяется несколькими колонками, тогда все они идут в
GROUP BYилиPARTITION BY.
Для дата-инженера важно назвать, где такая проверка живёт в проде. В dbt это встроенный тест unique на колонку, для составного ключа есть unique_combination_of_columns из пакета dbt_utils. В pandas это df.duplicated(subset=[...]), в Spark dropDuplicates для удаления и группировка с подсчётом для отчёта. Проверку ставят сразу после загрузки сырья, пока дубль не размножился джойнами по всей витрине.
Упомяните нормализацию: lower(trim(email)) сводит Ivan@Mail.ru с пробелом и ivan@mail.ru к одному ключу, без неё запрос такой дубль не увидит.
Где спотыкаются
Забывают про NULL. GROUP BY складывает все NULL в одну группу и покажет их как дубль, а COUNT(DISTINCT) их вообще не считает. Надо заранее решить, считаются ли пустые значения повтором.
Путают поиск и удаление. DELETE по результату GROUP BY снесёт все копии, включая ту, которую нужно оставить. Для удаления нужна оконная функция или DISTINCT ON в PostgreSQL.
Отвечают только запросом и не говорят о причине. Дубли в загрузке обычно означают неидемпотентный пайплайн или повторную доставку из очереди, и сильный ответ заканчивается предложением это починить.