# Основы оконных функций

postgres 4 / 8
3 min read
Table of Contents

Оконные функции в PostgreSQL: мощный инструмент аналитики

Оконные функции (Window Functions) в PostgreSQL — это продвинутый инструмент для выполнения вычислений над группами строк, связанных с текущей записью. В отличие от агрегатных функций (например, SUM(), AVG()), которые сворачивают множество строк в одну, оконные функции сохраняют исходную детализацию данных, добавляя к каждой строке результат вычислений. Это делает их незаменимыми для аналитических задач: ранжирования, расчета накопительных итогов, сравнения значений и многого другого.


Основы оконных функций

Ключевым элементом оконных функций является конструкция OVER(), которая определяет «окно» — набор строк, используемых для вычислений. Внутри OVER() можно задать:

  1. PARTITION BY — разбивает данные на группы (аналогично GROUP BY, но без свертки).
  2. ORDER BY — сортирует строки внутри окна.
  3. Фрейм (ROWS/RANGE) — задает диапазон строк относительно текущей записи.

Пример структуры:

SELECT
column1,
column2,
WINDOW_FUNCTION() OVER (
PARTITION BY column3
ORDER BY column4
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) AS result
FROM table_name;

Типы оконных функций

  1. Агрегатные функции как оконные
    Любая агрегатная функция (например, SUM(), AVG()) может быть использована с OVER().

    SELECT
    date,
    revenue,
    SUM(revenue) OVER (ORDER BY date) AS cumulative_sum
    FROM sales;

    Здесь cumulative_sum покажет нарастающий итог выручки по дням.

  2. Специализированные оконные функции

    • ROW_NUMBER() — порядковый номер строки в окне.
    • RANK() и DENSE_RANK() — ранжирование с пропусками и без.
    • LEAD() и LAG() — доступ к данным следующей или предыдущей строки.
    • FIRST_VALUE() и LAST_VALUE() — первое и последнее значение в окне.

    Пример ранжирования:

    SELECT
    product,
    price,
    RANK() OVER (ORDER BY price DESC) AS rank
    FROM products;

    Ранжирование товаров по убыванию цены.


Фреймы: контроль диапазона

Фрейм определяет, какие строки внутри окна участвуют в вычислениях. Используются ключевые слова:

  • ROWS BETWEEN N PRECEDING AND M FOLLOWING — физические строки.
  • RANGE BETWEEN … — логические интервалы (например, по значениям).

Пример скользящего среднего:

SELECT
date,
revenue,
AVG(revenue) OVER (
ORDER BY date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg
FROM sales;

Расчет среднего выручки за последние 3 дня (текущий + два предыдущих).


Практические кейсы

  1. Сравнение с предыдущим периодом

    SELECT
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY month) AS prev_month,
    revenue - LAG(revenue) OVER (ORDER BY month) AS delta
    FROM monthly_sales;
  2. Процент от итога группы

    SELECT
    department,
    employee,
    salary,
    salary * 100.0 / SUM(salary) OVER (PARTITION BY department) AS percent
    FROM employees;
  3. Удаление дубликатов
    Использование ROW_NUMBER() для выборки уникальных записей:

    WITH ranked AS (
    SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY created_at DESC) AS rn
    FROM orders
    )
    SELECT * FROM ranked WHERE rn = 1;

Оптимизация производительности

  • Индексы: Используйте индексы для столбцов в PARTITION BY и ORDER BY.
  • Фреймы: Узкие фреймы (например, ROWS BETWEEN 10 PRECEDING AND CURRENT ROW) работают быстрее.
  • Избегайте избыточных сортировок: Если несколько окон используют одинаковый ORDER BY, вынесите его в отдельное выражение WINDOW.

Заключение

Оконные функции в PostgreSQL открывают возможности для сложной аналитики прямо на уровне СУБД, уменьшая необходимость обработки данных на стороне приложения. Они идеальны для задач, требующих сохранения контекста каждой строки: ранжирования, расчетов скользящих показателей, сравнений и трендов. Освоив этот инструмент, вы сможете писать более эффективные и лаконичные запросы, раскрывая полный потенциал ваших данных.

Для углубленного изучения обратитесь к документации PostgreSQL и экспериментируйте с примерами!

Next: 1. Типы блокировок в PostgreSQL
Аватар автора

Спасибо, что прочитали статью. Посмотрите другие материалы в архиве, там много практических разборов по разным технологиям.


postgres Series

# 1. B-tree (Balanced Tree)

postgres 1 / 8
2 min read

Типы индексов в PostgreSQL: полный обзор и рекомендации по выбору Оптимизация запросов через правильное использование индексов Введение Индексы в PostgreSQL — это мощный инструмент для ускорения…

Read

# Работа с данными из нескольких таблиц в PostgreSQL: полное руководство

postgres 2 / 8
2 min read

PostgreSQL — мощная реляционная СУБД, предоставляющая множество инструментов для выборки данных из нескольких таблиц. В этой статье рассмотрим ключевые методы с примерами и советами по оптимизации.…

Read

# Что такое транзакция?

postgres 3 / 8
3 min read

Транзакции в PostgreSQL: Основы, Управление и Лучшие Практики Введение Транзакции — фундаментальный механизм обеспечения целостности данных в реляционных базах. В PostgreSQL они играют ключевую роль,…

Read

# Основы оконных функций

postgres 4 / 8
3 min read

Оконные функции в PostgreSQL: мощный инструмент аналитики Оконные функции (Window Functions) в PostgreSQL — это продвинутый инструмент для выполнения вычислений над группами строк, связанных с…

Continue

# 1. Типы блокировок в PostgreSQL

postgres 5 / 8
3 min read

Блокировки в PostgreSQL: механизмы управления параллельным доступом к данным Введение В многопользовательских средах базы данных, таких как PostgreSQL, блокировки играют ключевую роль в обеспечении…

Read

# 1. Использование индексов

postgres 6 / 8
3 min read

Оптимизация запросов в PostgreSQL: лучшие практики для повышения производительности PostgreSQL — мощная СУБД с широкими возможностями, но даже она может столкнуться с проблемами производительности…

Read

# Рекурсивные запросы в PostgreSQL: Иерархии, графы и не только

postgres 7 / 8
3 min read

Рекурсивные запросы — мощный инструмент PostgreSQL для работы с иерархическими структурами и графами. Они позволяют обрабатывать данные, где элементы связаны друг с другом через родительско-дочерние…

Read