😳 Window Functions — тот момент, когда SQL перестает быть просто SELECT'ами
Почти каждый аналитик сталкивается с задачами вроде:
— выбрать последний заказ каждого клиента — сравнить продажи с предыдущим месяцем — найти топ-3 товара в каждой категории — посчитать накопительную выручку — удалить дубликаты, оставив только актуальную запись
Новички часто решают это через подзапросы, десятки JOIN или вообще выгружают данные в Python
👁 Хотя в SQL для этого есть оконные функции
Главное, что нужно понять:
GROUP BY объединяет строки в одну WINDOW FUNCTIONS оставляют все строки на месте, но позволяют выполнять вычисления относительно других строк
🤓 Именно поэтому они стали стандартом в аналитике
Функции, которые стоит знать в первую очередь: ROW_NUMBER() — нумерация строк внутри группы. Идеально для дедупликации и поиска последней записи
RANK() / DENSE_RANK() — построение рейтингов. Разница только в том, как обрабатываются одинаковые значения
LAG() / LEAD() — доступ к предыдущей и следующей строке без JOIN Используются буквально везде: MoM/YoY, поиск разрывов между событиями, анализ пользовательского поведения, retention
SUM() OVER(), AVG() OVER(), COUNT() OVER() — накопительные суммы, скользящие средние, проценты от общего объема и другие аналитические метрики
В большинстве случаев всё сводится к одной конструкции:
OVER ( PARTITION BY ... ORDER BY ... )
PARTITION BY отвечает на вопрос: внутри каких групп считаем?
ORDER BY — в каком порядке считаем? Не зря на собеседованиях аналитиков задачи на ROW_NUMBER() и LAG() встречаются практически так же часто, как вопросы на JOIN. А в рабочих SQL-запросах без оконных функций уже сложно представить нормальный анализ данных А какая оконная функция у вас используется чаще всего? 👇