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

💻 Примеры

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

⚡ Кратко: примеры

  • MIN/MAX/AVG(unit_price) OVER (PARTITION BY order_id) — агрегат по заказу.
  • DISTINCT убирает дубли оконного результата.
  • SUM(quantity*unit_price) OVER (PARTITION BY product_id) и аналог через GROUP BY.
  • COUNT(product_id) OVER (PARTITION BY order_id, status_id).
  • SUM(quantity) OVER (ORDER BY date_received) — кумулятивное количество.
  • SUM(quantity*unit_cost) OVER (PARTITION BY product_id ORDER BY date_received).

Пример 1. MIN, MAX, AVG unit_price по заказу

Для каждой строки заказа выводим минимальную, максимальную и среднюю цену в этом заказе.

SELECT
    order_id,
    unit_price,
    MIN(unit_price) OVER (PARTITION BY order_id) AS min_price,
    MAX(unit_price) OVER (PARTITION BY order_id) AS max_price,
    AVG(unit_price) OVER (PARTITION BY order_id) AS avg_price
FROM order_details;

Пример 2. Только уникальные строки

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

SELECT DISTINCT
    order_id,
    MIN(unit_price) OVER (PARTITION BY order_id) AS min_price,
    MAX(unit_price) OVER (PARTITION BY order_id) AS max_price,
    AVG(unit_price) OVER (PARTITION BY order_id) AS avg_price
FROM order_details;

Пример 3. Суммарная стоимость продукта

Оконная функция сохраняет детальные строки; GROUP BY сворачивает результат.

-- Оконная функция
SELECT
    product_id,
    quantity,
    unit_price,
    quantity * unit_price AS line_total,
    SUM(quantity * unit_price) OVER (PARTITION BY product_id) AS product_total
FROM order_details;

-- GROUP BY
SELECT
    product_id,
    SUM(quantity * unit_price) AS product_total
FROM order_details
GROUP BY product_id;

Пример 4. Количество продуктов в заказе с учётом статуса

Считаем количество продуктов в каждой паре «заказ — статус».

SELECT
    order_id,
    status_id,
    product_id,
    COUNT(product_id) OVER (PARTITION BY order_id, status_id) AS products_count
FROM purchase_order_details;

Пример 5. Кумулятивное количество по дате получения

ORDER BY date_received в окне включает накопление от начала до текущей строки.

SELECT
    date_received,
    quantity,
    SUM(quantity) OVER (ORDER BY date_received) AS cumulative_quantity
FROM purchase_order_details;

Пример 6. Кумулятивная выручка по продукту

Накопленная стоимость поставок для каждого продукта по дате получения.

SELECT
    product_id,
    date_received,
    quantity,
    unit_cost,
    quantity * unit_cost AS line_cost,
    SUM(quantity * unit_cost) OVER (
        PARTITION BY product_id
        ORDER BY date_received
    ) AS cumulative_revenue
FROM purchase_order_details;