📁 Блок: SQL / MySQL / Оконные функции⏱️ Время изучения: ~90 мин🎯 Сложность: Практикум
⚡ Минимум для запоминания
MIN(col) / MAX(col) / AVG(col) OVER (PARTITION BY ...).
SUM(col) OVER (PARTITION BY ...) — сумма по группе.
SUM(col) OVER (ORDER BY ...) — кумулятивная сумма.
SUM(col) OVER (PARTITION BY ... ORDER BY ...) — кумулятивная сумма в группе.
COUNT(*) / COUNT(col) OVER (...) — количество строк или не-NULL значений.
Общий синтаксис
-- Агрегат по группе
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
-- Уникальные строки результата оконной функции
SELECT DISTINCT
column,
aggregate_function(expression) OVER (PARTITION BY column)
FROM table_name;
Команды / операторы / функции
Функция
Назначение
Пример
SUM()
Сумма значений в окне
SUM(quantity * unit_price) OVER (PARTITION BY order_id)
AVG()
Среднее значение в окне
AVG(unit_price) OVER (PARTITION BY order_id)
MIN()
Минимум в окне
MIN(unit_price) OVER (PARTITION BY order_id)
MAX()
Максимум в окне
MAX(unit_price) OVER (PARTITION BY order_id)
COUNT()
Количество строк или не-NULL значений
COUNT(product_id) OVER (PARTITION BY order_id, status_id)
OVER
Определяет окно строк для функции
OVER (PARTITION BY product_id ORDER BY date_received)
DISTINCT
Убирает дублирующиеся строки результата
SELECT DISTINCT order_id, MIN(unit_price) OVER (...)
Важные нюансы
COUNT(*) считает все строки окна, включая NULL.
COUNT(column) игнорирует NULL в конкретном столбце.
AVG и SUM игнорируют NULL-значения (строки при этом остаются).
Без ORDER BY в окне агрегат возвращает одно значение на всё окно/раздел.
С ORDER BY в окне агрегат накапливается от начала до текущей строки.