ФУНКЦИИ РАНЖИРОВАНИЯ

ФУНКЦИИ РАНЖИРОВАНИЯ

Функции ранжирования позволяют присвоить порядковый номер для строки внутри окна по какому-то признаку.

Функция ранжирование работает так:

row_number() over (partition by group1 order by feature)
  1. ROW_NUMBER()- функция ранжирование
  2. OVER - обращаемся к окну
  3. PARTITON BY group1 - определяем внутри какой группы ранжируем строку
  4. 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. Это еще одна особенность оконных функций. Чтобы отфильтроваться по результатам оконки, нужно писать подзапрос или представления.