К обычному разбору
Тренировка по собеседованию1 задачаТехническое собеседованиеДата не указана

MF Interview: SQL по расходам пользователей

Идите сверху вниз: сначала попробуйте сами, затем откройте разбор. Если шаг с кодом, пишите решение прямо здесь и запускайте проверки на странице.

1SQL-задачаEasy

Расходы пользователей по категориям товаров

Условие

Есть таблицы заказов и позиций заказа:

CREATE TABLE orders (
  order_id INTEGER PRIMARY KEY,
  user_id INTEGER NOT NULL
);

CREATE TABLE order_items (
  order_id INTEGER NOT NULL,
  item_category TEXT NOT NULL,
  item_price REAL NOT NULL,
  amount INTEGER NOT NULL
);

Посчитайте, сколько денег каждый пользователь потратил в каждой категории товаров.

Стоимость строки order_items равна item_price * amount.

Верните user_id, item_category, total_spent. Отсортируйте результат по user_id ASC, item_category ASC.

Решение прямо на странице

Напишите код, запустите проверки и только потом открывайте разбор.

Проверка решения

Нажмите «Запустить проверки» или Ctrl+Enter.

Показать разбор

Подсказки

  • Цена строки

    Не забудьте умножить item_price на amount.

  • Группировка

    Группировать нужно по пользователю и категории, а не только по пользователю.

Идея решения

Соединяем orders и order_items по order_id, чтобы получить пользователя для каждой позиции заказа.

Дальше группируем по user_id и item_category, а сумму считаем как SUM(item_price * amount).

Эталонный код

SELECT
  o.user_id,
  oi.item_category,
  SUM(oi.item_price * oi.amount) AS total_spent
FROM orders o
JOIN order_items oi
  ON o.order_id = oi.order_id
GROUP BY o.user_id, oi.item_category
ORDER BY o.user_id ASC, oi.item_category ASC;
Сложность
Время: O(n log n). Память: O(g).
JOIN проходит по позициям заказов, затем GROUP BY агрегирует строки по парам user_id/item_category. Сортировка результата добавляет log-фактор.