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;