Какие виды окон агрегации существуют в SQL для аналитических запросов?

«Какие виды окон агрегации существуют в SQL для аналитических запросов?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В SQL (используя оконные функции OVER()) я применяю следующие основные типы окон для агрегации данных:

  1. Скользящее окно (Moving/Rolling Window): Окно фиксированного размера, которое «скользит» по строкам. Например, скользящее среднее за последние 7 дней.

    SELECT date, revenue,
           AVG(revenue) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS avg_7day_revenue
    FROM daily_sales;
  2. Накопительное окно (Cumulative/Running Window): Окно от начала отсчета до текущей строки. Например, нарастающий итог.

    SELECT date, revenue,
           SUM(revenue) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sum
    FROM daily_sales;
  3. Окно по разбиению (Partitioned Window): Данные сначала разбиваются на группы (партиции), а затем внутри каждой группы применяется оконная функция. Например, ранжирование продаж внутри каждого отдела.

    SELECT department, employee, sales,
           RANK() OVER (PARTITION BY department ORDER BY sales DESC) AS rank_in_dept
    FROM employee_sales;
  4. Окно по диапазону (Range Window): Определяется на основе значений столбца, а не количества строк. Например, агрегация за последние 30 дней по дате.

    SELECT date, revenue,
           SUM(revenue) OVER (ORDER BY date RANGE BETWEEN INTERVAL '30' DAY PRECEDING AND CURRENT ROW) AS sum_last_30d
    FROM daily_sales;

Выбор типа окна зависит от конкретной аналитической задачи: анализ трендов (скользящее), расчет итогов (накопительное) или сравнение внутри групп (партиционирование).