📁 Блок: SQL / MySQL / Оконные функции⏱️ Время изучения: ~60 мин🎯 Сложность: Повторение
⚡ Минимум для запоминания
SUM(col) OVER (...) — сумма по окну.
AVG(col) OVER (...) — среднее по окну.
MIN(col) / MAX(col) OVER (...) — минимум и максимум.
COUNT(*) OVER (...) — число строк в окне.
ORDER BY внутри OVER включает накопление.
GROUP BY сворачивает строки; окно — нет.
Общий синтаксис
-- Окно из всех строк
aggregate_function(expression) OVER () AS alias
-- Окно внутри группы
aggregate_function(expression) OVER (PARTITION BY column) AS alias
-- Накопительное окно по порядку
aggregate_function(expression) OVER (ORDER BY column) AS alias
-- Накопление внутри группы
aggregate_function(expression) OVER (
PARTITION BY column
ORDER BY column
) AS alias
Команды / операторы / функции
Конструкция
Описание
Пример
SUM()
Сумма значений в окне
SUM(quantity * unit_cost) OVER (PARTITION BY order_id)
AVG()
Среднее значение в окне
AVG(unit_cost) OVER (PARTITION BY order_id)
MIN()
Минимум в окне
MIN(unit_cost) OVER (PARTITION BY order_id)
MAX()
Максимум в окне
MAX(unit_cost) OVER (PARTITION BY order_id)
COUNT()
Количество строк или не-NULL значений
COUNT(*) OVER (PARTITION BY date_received, posted_to_inventory)
OVER
Определяет окно строк для функции
OVER (PARTITION BY order_id ORDER BY date_received)
PARTITION BY
Разделяет строки на группы
PARTITION BY product_id
ORDER BY
Задаёт порядок строк внутри окна
ORDER BY date_received
GROUP BY
Сворачивает строки в одну на группу
GROUP BY order_id
DISTINCT
Убирает дублирующиеся строки результата
SELECT DISTINCT order_id, ...
Важные нюансы
COUNT(*) считает все строки окна, включая NULL.
COUNT(column) игнорирует NULL в конкретном столбце.
AVG и SUM игнорируют NULL-значения (строки при этом остаются).
Без ORDER BY в окне агрегат возвращает одно значение на всё окно/раздел.
С ORDER BY агрегат накапливается от начала до текущей строки.