← Назад к вопросам
SQL: Найти пользователей с максимальным чеком в каждом месяце
2.3 Middle🔥 171 комментариев
#SQL и базы данных
Условие
У вас есть таблица orders:
- order_id (integer)
- user_id (integer)
- order_date (date)
- total_amount (decimal)
Найдите пользователя с максимальной суммой заказа в каждом месяце.
Ожидаемый результат:
Таблица с колонками:
- month
- user_id
- max_order_amount
Если в месяце несколько пользователей с одинаковой максимальной суммой, выведите всех.
Источник: типовая задача на собеседованиях
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Найти максимальный чек в каждом месяце
Используем MAX() window function для нахождения максимума в каждом месяце:
WITH max_monthly AS (
SELECT
DATE_TRUNC('month', order_date) as month,
user_id,
total_amount,
MAX(total_amount) OVER (PARTITION BY DATE_TRUNC('month', order_date)) as max_amt
FROM orders
)
SELECT
month::date,
user_id,
total_amount as max_order_amount
FROM max_monthly
WHERE total_amount = max_amt
ORDER BY month, user_id;
Ключевые части:
- MAX() OVER (PARTITION BY месяц) вычисляет максимум для каждого месяца
- WHERE total_amount = max_amt оставляет только записи с максимальной суммой
- Если несколько пользователей имеют одинаковый максимум, выведет всех
Альтернатива с RANK():
WITH ranked AS (
SELECT
DATE_TRUNC('month', order_date) as month,
user_id,
total_amount,
RANK() OVER (PARTITION BY DATE_TRUNC('month', order_date) ORDER BY total_amount DESC) as rnk
FROM orders
)
SELECT month::date, user_id, total_amount
FROM ranked
WHERE rnk = 1
ORDER BY month;
Для MySQL:
SELECT DATE_FORMAT(o.order_date, '%Y-%m-01') as month,
o.user_id,
o.total_amount
FROM orders o
JOIN (SELECT DATE_FORMAT(order_date, '%Y-%m-01') as m, MAX(total_amount) as mx FROM orders GROUP BY m) mx
ON DATE_FORMAT(o.order_date, '%Y-%m-01') = mx.m AND o.total_amount = mx.mx
ORDER BY month, user_id;