← К оглавлению занятия

🏠 Домашнее задание

📁 Блок: SQL / MySQL / Оконные функции ⏱️ Время изучения: ~90 мин 🎯 Сложность: Продвинутая

⚡ Кратко: домашнее задание

  1. Для каждого order_id вывести MIN, MAX, AVG unit_cost.
  2. Оставить только уникальные строки.
  3. Посчитать quantity*unit_cost и суммарную стоимость заказа окном и через GROUP BY.
  4. По date_received и posted_to_inventory вывести флаг >1 / =1.

🏠 Домашнее задание из LMS

1

Условия

Для выполнения домашнего задания используется база данных с доступом на чтение:

  • hostname: ich-db.edu.itcareerhub.de
  • MYSQL_USER: ich1
  • MYSQL_PASSWORD: ich1_password_ilovedbs

Рабочая таблица: purchase_order_details.

  1. Для каждого заказа order_id выведите минимальный, максимальный и средний unit_cost.
  2. Оставьте только уникальные строки из предыдущего запроса.
  3. Посчитайте стоимость продукта в заказе как quantity * unit_cost. Выведите суммарную стоимость продуктов с помощью оконной функции. Сделайте то же самое с помощью GROUP BY.
  4. Посчитайте количество заказов по дате получения date_received и posted_to_inventory. Если оно превышает 1, то выведите '>1', в противном случае '=1'. Выведите purchase_order_id, date_received и вычисленный столбец.

🛠️ Подготовка окружения

  1. Откройте DBeaver или MySQL Workbench.
  2. Создайте подключение к учебной базе: хост ich-db.edu.itcareerhub.de, пользователь ich1, пароль ich1_password_ilovedbs.
  3. Откройте новый SQL-редактор и выберите схему с таблицей purchase_order_details.
  4. База доступна только на чтение — используйте SELECT-запросы.

📝 Пошаговое решение

1

Задача 1. MIN, MAX и AVG unit_cost по order_id

Оконные функции считают агрегат внутри каждого заказа, не сворачивая строки.

SELECT
    order_id,
    MIN(unit_cost) OVER (PARTITION BY order_id) AS min_unit_cost,
    MAX(unit_cost) OVER (PARTITION BY order_id) AS max_unit_cost,
    AVG(unit_cost) OVER (PARTITION BY order_id) AS avg_unit_cost
FROM purchase_order_details;
2

Задача 2. Только уникальные строки

Так как оконные функции дублируют результат в каждую строку заказа, достаточно добавить DISTINCT.

SELECT DISTINCT
    order_id,
    MIN(unit_cost) OVER (PARTITION BY order_id) AS min_unit_cost,
    MAX(unit_cost) OVER (PARTITION BY order_id) AS max_unit_cost,
    AVG(unit_cost) OVER (PARTITION BY order_id) AS avg_unit_cost
FROM purchase_order_details;
3

Задача 3. Суммарная стоимость заказа

Сначала считаем стоимость строки, затем сумму по заказу окном. Вариант с GROUP BY даёт свёрнутый результат.

-- Оконная функция: сохраняем строки
SELECT
    order_id,
    product_id,
    quantity,
    unit_cost,
    quantity * unit_cost AS line_total,
    SUM(quantity * unit_cost) OVER (PARTITION BY order_id) AS order_total
FROM purchase_order_details;

-- GROUP BY: одна строка на заказ
SELECT
    order_id,
    SUM(quantity * unit_cost) AS order_total
FROM purchase_order_details
GROUP BY order_id;
4

Задача 4. Флаг количества заказов по дате и статусу

Считаем количество строк в окне по паре date_received и posted_to_inventory и превращаем его в текстовый флаг.

SELECT
    purchase_order_id,
    date_received,
    CASE
        WHEN COUNT(*) OVER (PARTITION BY date_received, posted_to_inventory) > 1
            THEN '>1'
        ELSE '=1'
    END AS order_count_flag
FROM purchase_order_details;

✅ Проверка

  1. Выполните каждый запрос в DBeaver и убедитесь, что он не возвращает ошибок синтаксиса.
  2. Для задачи 2 убедитесь, что количество строк равно числу уникальных order_id.
  3. Для задачи 3 сравните суммы из оконного варианта и варианта с GROUP BY — они должны совпадать.
  4. Для задачи 4 проверьте, что флаг =1 стоит там, где группа состоит из одной строки.