В таблице метрик есть dt, platform, dau. Нужно вывести значение dau за предыдущий день для той же платформы, чтобы посчитать дневное изменение. Какое выражение верное?

ALEAD(dau) OVER (PARTITION BY platform ORDER BY dt)
BLAG(dau) OVER (PARTITION BY platform) без ORDER BY
CLAG(dau) OVER (ORDER BY dt) без PARTITION BY
DLAG(dau) OVER (PARTITION BY platform ORDER BY dt)
Правильный ответ. LAG берёт предыдущее значение по ORDER BY внутри каждой группы, заданной PARTITION BY.

Разбор

Чтобы получить «вчерашний» dau, нужно определить порядок по времени через ORDER BY dt. Чтобы сравнение шло внутри одной платформы, нужно PARTITION BY platform. Поэтому корректно: LAG(dau) OVER (PARTITION BY platform ORDER BY dt). Без сортировки понятие «предыдущий день» не определено, без разбиения по платформе вы будете сравнивать разные платформы, а LEAD берёт следующее значение, а не предыдущее.

Проверь себя · 1/3разбор после ответа
Хотите добавить к каждой транзакции колонку «доля от общей суммы транзакций этого пользователя» и при этом не терять детализацию по транзакциям. Какой фрагмент корректен?
Тренировать SQL в Telegram

Ещё вопросы по теме «Оконные функции»