Любое уважающее себя (но это не точно) техническое интервью обязательно содержит вопрос или задачку про эти функции. Понятия не имею откуда это пошло — не то чтобы это были какие-то сверхпопулярные оконки, скорее даже редкие, но имеем что имеем.
Если ты, по каким-то загадочным причинам, слышишь об этом в первый раз, то гоу разбираться.
Смысл этих функций в притягивании соседа ДО или соседа ПОСЛЕ.
В общем виде выглядит как и любая другая оконка:
lag(some_col) over(partition by some_id order by some_dt)
Т.е. “внутри каждого потока
some_id отсортируй строки по some_dt и достань мне предыдущее значение столбца some_col”.Как и любую другую оконку можно засунуть эту конструкцию прямиком в
select, в условие case или where, а при особом желании даже в join можно затянуть.А что по примерам использования, когда полезно?
🟡При анализе пользовательских путей, если нужно достать название страницы / экрана, который предшествовал заданному. Например для поиска ключевых точек типа откуда юзеры чаще всего попадают на страницу товара;
🟡При осмотре каких-то метрик на текущий момент, чтобы быстро сравнить с предыдущим периодом и показать разницу, растёт или падает. Такое чаще практикуется в репортах, когда нужна одна конкретная цифра “на сейчас” и стрелка вверх-вниз;
🟡При анализе оттока, чтобы быстро посчитать разницу в количестве дней от текущей даты и последней датой активности юзера. Хотя тут и есть более ходовой вариант через max(date), тем не менее юзабельно;
🟡При построении всяких недельных саммари, когда нужно учитывать, например, только рабочие дни.
#собесы
