Предположим, мы хотим создать рейтинг, в котором позиция каждой записи определяется значением одного или нескольких столбцов.
Решение — использовать функцию
rank() поверх SQL-окна, упорядоченного по целевым столбцам.Пример
Отранжируем сотрудников из таблицы
employees по зарплате:select
rank() over w as "rank",
name, department, salary
from employees
window w as (order by salary desc)
order by "rank", id;
r sal name
1 120 Иван
2 104 Леонид
2 104 Марина
4 100 Анна
5 96 Вероника
5 96 Григорий
7 90 Ксения
Функция
rank() присваивает каждому сотруднику ранг в соответствии с его зарплатой (order by salary desc).Обратите внимание, что сотрудники с одинаковой зарплатой получили одинаковые ранги (Леонид и Марина, Вероника и Григорий).
Нюансы
— Можно использовать
dense_rank() вместо rank(), чтобы избежать «дыр» в рангах.— Если СУБД не поддерживает инструкцию
window, можно встроить определение окна: rank over (order by ...)→ Оконные функции SQL