Оконная функция

Оконная функция — это механизм SQL, выполняющий вычисления над набором строк, связанных с текущей записью, без агрегации результата в одну строку. В интернет-маркетинге этот инструмент позволяет сохранять гранулярность данных при расчете сложных метрик, таких как ранжирование лидов или Когортный анализ. Оконная функция добавляет новые столбцы к исходной таблице, обеспечивая детализированный взгляд на Поведение пользователей и эффективность рекламных кампаний.

Главное

  • Инструмент сохраняет все исходные строки выборки, в отличие от GROUP BY, который сводит данные к одному значению.
  • Ключевая конструкция OVER() определяет границы окна через PARTITION BY (группы) и ORDER BY (порядок).
  • Поддерживает три типа: агрегатные (SUM), ранжирующие (ROW_NUMBER) и временные смещения (LAG/LEAD).
  • Незаменим для расчета скользящих средних, накопительного LTV и атрибуции конверсий в сквозной аналитике.

Как работает Оконная функция

Механизм обработки данных начинается с определения границ «окна» с помощью оператора OVER(). Сначала база данных разбивает таблицу на партиции по заданному критерию, например, по ID рекламной кампании. Затем внутри каждой группы строки сортируются по дате или другому ключу. После этого вычисление применяется к каждой записи индивидуально, учитывая только те строки, которые попадают в текущее окно. Это позволяет видеть общую сумму продаж параллельно с вкладом каждого менеджера.

Зачем нужен Оконная функция

Этот инструмент необходим для задач, где требуется Сравнение текущей строки с предыдущими или последующими без потери детализации. В Веб-аналитике он позволяет рассчитать конверсию каждого шага воронки, сравнивая её с показателями прошлого дня. Без использования оконных аналитикам приходилось бы писать сложные самообъединения (self-join), что замедляло выполнение запросов и усложняло поддержку кода. Современный подход обеспечивает высокую скорость обработки больших объемов данных.

Какие бывают виды оконной функции

Существует три основные категории инструментов для решения разных аналитических задач. Агрегатные функции (SUM, AVG, COUNT) вычисляют итоги по окну, но возвращают результат для каждой строки. Ранжирующие функции (ROW_NUMBER, RANK, DENSE_RANK) присваивают порядковые номера, что полезно для выделения ТОП-товаров. Функции смещения (LAG, LEAD) обращаются к соседним строкам, позволяя сравнивать показатели текущего периода с прошлым или будущим.

Где используется Оконная функция

Инструмент активно применяется в BI-системах, ETL-процессах и системах сквозной аналитики. Маркетологи используют его для когортного анализа удержания, рассчитывая процент возврата клиентов по неделям. Также механизм критичен для распределения ценности сделки при многоканальной атрибуции. Он помогает дедуплицировать данные, выбирая последний известный Статус заказа или актуальную цену товара из истории изменений.

Пример: установка и чтение оконной функции

Рассмотрим практический пример расчета ранжирования кликов по датам внутри рекламной кампании. Запрос использует ROW_NUMBER для нумерации и SUM для накопительного итога. Обратите внимание на использование PARTITION BY для разделения по кампании и ORDER BY для хронологического порядка.

sql
SELECT
  campaign_id,
  click_date,
  clicks,
  ROW_NUMBER() OVER (
    PARTITION BY campaign_id
    ORDER BY click_date
  ) AS day_rank,
  SUM(clicks) OVER (
    PARTITION BY campaign_id
    ORDER BY click_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS cumulative_clicks
FROM ad_performance;

Используйте ROWS BETWEEN для расчета скользящих средних, ограничивая окно конкретным количеством дней, например, последние 7 записей.

Часто задаваемые вопросы оконной функции

Часто задаваемые вопросы

В чем разница между GROUP BY и оконными функциями?

GROUP BY объединяет строки в одну агрегированную запись, теряя исходную детализацию. Оконные функции добавляют вычисленные значения к каждой строке, сохраняя полную структуру таблицы. Это позволяет видеть как общие тренды, так и индивидуальные показатели одновременно.

Что такое PARTITION BY в конструкции OVER?

Это Оператор, который разделяет данные на независимые группы или «партиции». Вычисления внутри функции применяются отдельно к каждой группе. Например, можно рассчитать Рейтинг товаров внутри каждой категории, не смешивая данные разных отделов.

Когда использовать LAG вместо JOIN?

Функция LAG обращается к предыдущей строке без необходимости соединять таблицу саму с собой. Это значительно ускоряет выполнение запросов и упрощает код. Используйте её для сравнения показателей текущего дня с предыдущим или расчета роста метрик.

Можно ли использовать несколько оконных функций в одном запросе?

Да, в одном SELECT можно указать любое количество оконных функций. Каждая может иметь свой уникальный набор параметров PARTITION BY и ORDER BY. Это позволяет одновременно ранжировать данные, считать средние значения и определять место в списке лидеров.

Как оптимизировать Производительность тяжелых оконных запросов?

Для ускорения работы создавайте индексы по полям, используемым в PARTITION BY и ORDER BY. Избегайте использования оконных функций в условиях WHERE, если это возможно, так как они вычисляются после фильтрации. Правильное Ограничение объема данных перед применением функции снижает нагрузку на память.

Итоги

Оконная функция является мощным инструком SQL для построчных вычислений, который сохраняет исходную гранулярность данных при добавлении новых аналитических метрик.

  • Позволяет рассчитывать агрегаты, ранги и смещения без потери детализации строк.
  • Использует конструкцию OVER для гибкого определения границ вычислений.
  • Критически важна для когортного анализа, воронок продаж и атрибуции.
  • Заменяет сложные самообъединения, повышая скорость и читаемость кода.
  • Поддерживает работу с временными рамками для динамических метрик.
  • Является стандартом де-факто в современной маркетинговой аналитике.
  • Обеспечивает точное Сравнение показателей внутри сегментов аудитории.