Подсчитайте email через GROUP BY, дубли отберите HAVING COUNT(*) > 1. Для удаления оставьте запись с минимальным id в каждой группе.
Выявление и удаление повторяющихся email‑адресов
Подсчитайте email через GROUP BY, дубли отберите HAVING COUNT(*) > 1. Для удаления оставьте запись с минимальным id в каждой группе.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В таблице Person хранятся email‑адреса пользователей. Возможны случаи, когда один и тот же email встречается несколько раз. Требуется:
- Подсчитать, сколько раз каждый email встречается в таблице.
- Вывести список email‑ов, количество их вхождений превышает единицу.
- Удалить из таблицы все дубли, оставив только одну запись для каждого уникального email‑а.
Пример входных данных
+----+-------------------+
| id | email |
+----+-------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+-------------------+
Ожидаемый результат
+----+-------------------+
| id | email |
+----+-------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+-------------------+
CREATE TABLE Person (
id INT PRIMARY KEY,
email VARCHAR(255)
);
Ответ
Подсчитайте email через GROUP BY, дубли отберите HAVING COUNT(*) > 1. Для удаления оставьте запись с минимальным id в каждой группе.
Подсчёт и просмотр:
SELECT email, COUNT(*) AS occurrences
FROM Person
GROUP BY email;
SELECT email, COUNT(*) AS occurrences
FROM Person
GROUP BY email
HAVING COUNT(*) > 1;
Пример удаления для PostgreSQL:
WITH duplicates AS (
SELECT id, ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM Person
)
DELETE FROM Person
USING duplicates
WHERE Person.id = duplicates.id AND duplicates.rn > 1;
Перед удалением просмотрите те же строки через SELECT, сохраните резервную копию и проверьте внешние ссылки. Нужны транзакция и защита от конкурентного появления дублей. Уточните правила регистра и NULL; показанная группировка считает все NULL одной группой. После очистки добавьте подходящее уникальное ограничение.