Что важно знать
- Оконные функции не схлопывают строки, в отличие от GROUP BY.
ROW_NUMBER,RANK,LAG,LEAD, накопительные суммы.- Размножение строк при JOIN «один ко многим» — завышенные суммы.
- Медиана и перцентили —
percentile_cont.
Оконные функции, когортный retention, воронки, сессии, серии и перцентили.
ROW_NUMBER, RANK, LAG, LEAD, накопительные суммы.percentile_cont.Практика. Решить 20 задач на оконные функции на учебной базе заказов.
Практика. Посчитать на SQL когортный retention, воронку покупки и среднюю длительность сессии по таблице событий.
Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.
DAU — число уникальных пользователей за день: COUNT(DISTINCT user_id) GROUP BY day. MAU календарный — то же по месяцам. Скользящий MAU на каждый день — уникальные за последние 30 дней; его нельзя получить суммой DAU (пользователь посчитается много раз) …
Полный разборДля каждого пользователя определить, дошёл ли он до каждого шага в правильном порядке (время шага не раньше предыдущего) и в пределах окна (например, 7 дней от первого шага), затем посчитать число пользователей на каждом шаге и доли от первого и от…
Полный разборНайти: GROUP BY ключ HAVING COUNT() > 1. Оставить последнюю версию: пронумеровать строки внутри ключа ROW_NUMBER() OVER (PARTITION BY ключ ORDER BY updated_at DESC) и взять rn = 1 — в выборке или в DELETE с этим условием.
Полный разборКлассический приём «gaps and islands»: пронумеровать даты активности пользователя ROW_NUMBER и вычесть номер из даты — у дней одной непрерывной серии разность одинакова. Затем группировать по (пользователь, эта разность) и считать длину серии.
Полный разборСвязь один-ко-многим размножает строки: заказ с тремя позициями после JOIN с позициями превращается в три строки, и SUM(order.amount) учитывает сумму заказа трижды. Решение — сначала агрегировать каждую таблицу до нужной гранулярности, потом соединять; или…
Полный разборОпределить когорту каждого пользователя (обычно неделя или месяц первого действия), для каждого события посчитать номер периода от начала когорты, затем посчитать уникальных активных пользователей по (когорта, период) и разделить на размер когорты.
Полный разборGROUP BY схлопывает группу в одну строку; оконная функция считает по группе строк (окну), сохраняя все строки. Окно задаёт OVER (PARTITION BY … ORDER BY … ROWS …). Основные: ранжирующие (ROW_NUMBER, RANK, DENSE_RANK), смещения (LAG, LEAD), агрегаты по окну…
Полный разборПронумеровать строки внутри группы оконной функцией и отфильтровать номер во внешнем запросе: ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY amount DESC) и WHERE rn <= 3. Если важны «ничьи» — DENSE_RANK или RANK вместо ROW_NUMBER.
Полный разборВ PostgreSQL: PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY x) — медиана с интерполяцией между значениями, PERCENTILE_DISC — ближайшее реальное значение. В ClickHouse — quantile, в BigQuery — APPROX_QUANTILES. Среднее чувствительно к выбросам: один заказ на…
Полный разборСессия — серия событий пользователя без пауз дольше порога (обычно 30 минут). LAG даёт время предыдущего события; где пауза больше порога — флаг начала новой сессии; нарастающая сумма флагов по пользователю — номер сессии. Дальше агрегаты по (пользователь…
Полный разборПосле собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.