Что такое оконная функция? И в чем отличие от функции агрегации с группировкой?

Оконная функция (window function) в SQL – это мощный инструмент для анализа данных, который позволяет выполнять вычисления на подмножестве строк (окно) внутри результирующего набора строк, обычно на основе определенного порядка сортировки. Оконные функции выполняются в контексте каждой строки результирующего набора и могут использоваться для выполнения агрегаций, аналитических и статистических вычислений, ранжирования данных и других аналитических задач. Основное отличие оконных функций от агрегатных функций с группировкой заключается в том, что оконные функции сохраняют индивидуальные строки в результирующем наборе и позволяют выполнять вычисления на каждой строке независимо.

Вот некоторые особенности оконных функций и их отличия от агрегатных функций с группировкой:

  1. Обработка индивидуальных строк:
    • Оконные функции работают с каждой строкой результирующего набора независимо. Каждой строке может быть применена функция на основе определенного окна строк, заданного порядком сортировки и фильтрацией.
    • Агрегатные функции с группировкой выполняют вычисления на группах строк, объединенных по определенным критериям (группировке).
  2. Окно строк:
    • Для оконных функций важен порядок сортировки и определенное окно строк, в котором выполняются вычисления. Это позволяет, например, находить “текущую строку” и опираться на предыдущие и последующие строки в окне.
    • В агрегатных функциях с группировкой данные обычно сгруппированы и вычисляются для каждой группы в отдельности без учета порядка сортировки.
  3. Результат на каждой строке:
    • Оконные функции возвращают результат для каждой строки результирующего набора, расположенной в заданном окне. Результаты могут различаться для разных строк.
    • Агрегатные функции с группировкой возвращают единый результат для каждой группы строк, объединенных по определенным критериям.

Примеры оконных функций включают в себя функции, такие как ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), SUM() OVER(), AVG() OVER(), MAX() OVER(), MIN() OVER() и многие другие. Эти функции позволяют выполнять анализ данных на основе контекста каждой строки и анализировать тенденции и паттерны в данных, сохраняя при этом индивидуальные строки в результирующем наборе.