← Назад к вопросам

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;
SQL: Найти пользователей с максимальным чеком в каждом месяце | PrepBro