📖 Теория
⚡ Кратко: теория
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-е значение окна.
Как выбрать функцию
Если задача говорит «топ», «место», «ранг», обычно нужна функция ранжирования. Если задача говорит «предыдущий», «следующий», «первая цена», «последняя дата» — нужна функция смещения или выбора.
Правило: сначала сформулируйте, какую строку нужно увидеть рядом с текущей, потом выбирайте функцию.