← К оглавлению занятия

📖 Теория

📁 Блок: SQL / MySQL / Оконные функции ⏱️ Время изучения: ~60 мин 🎯 Сложность: Повторение

⚡ Кратко: теория

Summary session 10 повторяет два блока оконных функций: ранжирование и смещение/выбор.

Для ранжирования используем ROW_NUMBER, RANK, DENSE_RANK, NTILE.

Для сравнения соседних строк используем LAG и LEAD; для крайних значений — FIRST_VALUE и LAST_VALUE.

Минимальный пример: DENSE_RANK() OVER (ORDER BY quantity DESC) строит рейтинг по количеству, а LAG(date_received) OVER (ORDER BY date_received) находит предыдущую дату.

Топ-3 ошибки: путать RANK и DENSE_RANK, забывать ORDER BY в окне, фильтровать результат окна до внешнего SELECT.

Ранжирующие функции

Источник начинает повторение с основных ранжирующих функций: RANK, DENSE_RANK, ROW_NUMBER, NTILE.

ФункцияКогда использоватьОсобенность
ROW_NUMBERНужна уникальная позиция строкиНе учитывает равенства
RANKНужен рейтинг с пропусками после ничьей1, 1, 3
DENSE_RANKНужен рейтинг без пропусков1, 1, 2
NTILEНужно разделить строки на группыНапример, квартиль или третиль

Функции смещения и выбора

Вторая часть summary повторяет LEAD, LAG, FIRST_VALUE, LAST_VALUE, NTH_VALUE. Они не ранжируют строки, а возвращают значение из другой позиции окна.

  • LAG — предыдущая строка.
  • LEAD — следующая строка.
  • FIRST_VALUE — первое значение окна.
  • LAST_VALUE — последнее значение окна.
  • NTH_VALUE — n-е значение окна.

Как выбрать функцию

Если задача говорит «топ», «место», «ранг», обычно нужна функция ранжирования. Если задача говорит «предыдущий», «следующий», «первая цена», «последняя дата» — нужна функция смещения или выбора.

Правило: сначала сформулируйте, какую строку нужно увидеть рядом с текущей, потом выбирайте функцию.