Функции ранжирования позволяют присвоить порядковый номер для строки внутри окна по какому-то признаку.
Функция ранжирование работает так:
row_number() over (partition by group1 order by feature)
ROW_NUMBER()
- функция ранжированиеOVER
- обращаемся к окнуPARTITON BY group1
- определяем внутри какой группы ранжируем строкуORDER BY feature
- по какому признаку ранжируемСуществуют несколько видов функций ранжирования, чтобы лучше их понять рассмотрим их на простых примерах:
ROW_NUMBER()
- простая нумерация строк, каждая новая строка это N + 1;RANK()
- если у строк одинаковое значение, то возвращается одинаковый ранг, но пропускается следующий ранг;DENSE_RANK()
- ранг строки, если у строк одинаковое значение, то возвращается одинаковый ранг, следующий ранг идет по порядку и не пропускается в отличие от rank();PERCENT_RANK()
- относительный ранг текущей строки: (rank - 1) / (общее число строк - 1);NTILE()
- разбивает строку на n групп и каждой присваивает номер группы в зависимости от расположения строки.Давайте рассмотрим функцию ранжирование на реальном примере:
Допустим, для каждой команды нам нужно взять игроков, которые входят в топ-5 лучших рейтингов. Если рейтинг одинаковый, то место у них должно быть одинаковое. Запрос будет выглядеть так:
select
club,
short_name,
overall,
range
from
(
select
club,
short_name,
overall,
dense_rank() over (partition by club order by overall desc) as range
from
fifa_players_2018
) as t1
where
range <= 5
В подзапросе выводим игрока, рейтинг, команду и его ранг по рейтингу внутри команды. Потом фильтруем по рангу, чтобы он был меньше или равен 5, и получаем для каждой команды топ 5 рангов.
Из этого примера, вы видите, что мы не можем результат в оконной функции сразу использовать в конструкции WHERE
. Это еще одна особенность оконных функций. Чтобы отфильтроваться по результатам оконки, нужно писать подзапрос или представления.