Пользователи с более чем одной покупкой в день

34. Найти пользователей с несколькими покупками за день

Условие задачи:
Дана таблица T1(date, user_id) с информацией о покупках пользователей.

Необходимо найти случаи, когда один пользователь совершил более одной покупки в один и тот же день, и вывести пары:

(date, user_id)

Спойлеры к решению

Подсказки
💡 Сгруппируй записи одновременно по дате и пользователю.
💡 Для подсчёта покупок используй COUNT(*).
💡 Условия на агрегированные значения задаются через HAVING.
💡 Оставь только группы, где количество покупок больше одной.

Решение

Основной вариант через GROUP BY и HAVING:

SELECT
    date,
    user_id
FROM T1
GROUP BY
    date,
    user_id
HAVING COUNT(*) > 1;

Сначала записи группируются по пользователю и дате:

GROUP BY date, user_id

Затем остаются только группы, содержащие более одной покупки:

HAVING COUNT(*) > 1

Альтернативный вариант через оконную функцию:

SELECT DISTINCT
    date,
    user_id
FROM (
    SELECT
        date,
        user_id,
        COUNT(*) OVER (
            PARTITION BY date, user_id
        ) AS purchase_count
    FROM T1
) t
WHERE purchase_count > 1;

Если поле date на самом деле хранит дату и время (TIMESTAMP), то для группировки именно по дням необходимо сначала получить дату, например в PostgreSQL:

SELECT
    date::date AS purchase_date,
    user_id
FROM T1
GROUP BY
    date::date,
    user_id
HAVING COUNT(*) > 1;