41. Найти повторяющиеся email
Условие задачи:
Дана таблица Employee(id, email, salary).
Необходимо найти все email, которые встречаются в таблице более одного раза.
Пример:
email
-----
a
b
c
a
Результат:
a
Спойлеры к решению
Подсказки
💡 Сгруппируй строки по
💡 Для каждой группы посчитай количество записей через
💡 Для фильтрации агрегированных данных используй
💡 Оставь только группы, в которых количество записей больше одного.
email.💡 Для каждой группы посчитай количество записей через
COUNT(*).💡 Для фильтрации агрегированных данных используй
HAVING.💡 Оставь только группы, в которых количество записей больше одного.
Решение
Основной вариант через GROUP BY и HAVING:
SELECT email
FROM Employee
GROUP BY email
HAVING COUNT(*) > 1;
Сначала строки группируются по адресу электронной почты:
GROUP BY email
Затем остаются только те группы, в которых найдено больше одной записи:
HAVING COUNT(*) > 1
Если также нужно увидеть количество повторений:
SELECT
email,
COUNT(*) AS email_count
FROM Employee
GROUP BY email
HAVING COUNT(*) > 1;
Альтернативный вариант через оконную функцию:
SELECT DISTINCT email
FROM (
SELECT
email,
COUNT(*) OVER (
PARTITION BY email
) AS email_count
FROM Employee
) e
WHERE email_count > 1;
Если NULL в поле email не должен считаться дубликатом, нужно дополнительно исключить такие строки через WHERE email IS NOT NULL.