Поиск дублированных email

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.