В PostgreSQL имеются несколько функций, которые можно использовать для присуждения мест участникам некоего соревнования.
- row_number -- просто занумерует строки подряд, начиная от 1, все строки получат уникальные номера, даже если у них одинаковое количество "очков";
- rank -- реализует стандартный алгоритм ранжирования, 1224; строки с одинаковым количеством очков получают одинаковое место, дальше пропускается количество мест;
- dense_rank -- реализует "плотный" алгоритм ранжирования, 1223, как предудыщий, только строки не пропускаются никогда.
Формальный синтаксис:
RANK() OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
Использование:
SELECT
c,
RANK () OVER (
ORDER BY c
) rank_number
FROM
ranks;