💻 Примеры
⚡ Кратко: примеры
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;