Task Livecoding SQL Delete Duplicates Emails

50. Удаление дублей из таблицы emails #

Условие задачи:
📌 В таблице emails(id, email) могут встречаться дублирующиеся email-адреса.
Нужно написать SQL-запрос, который удаляет дубликаты, оставляя только одну запись для каждого уникального email.

Код:

CREATE TABLE emails (
    id INT,
    email VARCHAR(30)
);

INSERT INTO emails(id, email)
VALUES
(1, 'aa@yandex.ru'),
(2, 'bb@yandex.ru'),
(3, 'aa@yandex.ru');
Спойлеры к решению
Подсказки
💡 Чтобы удалить дубли, сначала нужно определить, какая запись считается “уникальной” — например, с минимальным id.
💡 Можно использовать CTE с ROW_NUMBER() или подзапрос с MIN(id).
💡 Убедитесь, что удаляете только дубли, а не все строки.
Решение
-- ✅ Вариант 1. Через CTE и ROW_NUMBER()
WITH duplicates AS (
    SELECT 
        id,
        ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
    FROM emails
)
DELETE FROM emails
WHERE id IN (
    SELECT id FROM duplicates WHERE rn > 1
);
-- ✅ Вариант 2. Без CTE (через подзапрос)
DELETE FROM emails
WHERE id NOT IN (
    SELECT MIN(id)
    FROM emails
    GROUP BY email
);

🧠 Пояснение:

  • GROUP BY email группирует одинаковые адреса.

  • MIN(id) оставляет один экземпляр (с наименьшим id).

  • Все остальные строки с тем же email удаляются.

После выполнения останется:

idemail
1aa@yandex.ru
2bb@yandex.ru