RANK vs DENSE_RANK: в чём разница на собесе по SQL

RANK и DENSE_RANK — оконные функции для нумерации внутри партиции. Различаются обработкой ничьих: RANK пропускает следующие номера, DENSE_RANK — нет. На собесе спрашивают почти всегда, когда речь о топ-N с возможными равенствами.

Если коротко. При ничьей RANK ставит обоим один номер и пропускает следующий (1,1,3), DENSE_RANK идёт подряд (1,1,2).
Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

RANK vs DENSE_RANK: таблица различий

ПараметрRANKDENSE_RANK
Поведение при ничьейОдинаковый номерОдинаковый номер
Следующий после ничьейПропускаетИдёт подряд
Пример (10,10,8,7)1, 1, 3, 41, 1, 2, 3
УникальностьНе уникаленНе уникален
Когда стандартСпортивные рейтингиУровни/группировки

Когда использовать RANK

Когда использовать DENSE_RANK

На примере

RANK — с пропусками
SELECT product_id, revenue,
       RANK() OVER (ORDER BY revenue DESC) AS r
FROM products;
DENSE_RANK — без пропусков
SELECT product_id, revenue,
       DENSE_RANK() OVER (ORDER BY revenue DESC) AS r
FROM products;

Ловушка на собесе

Если нужна строго уникальная нумерация без ничьих — берите ROW_NUMBER. RANK и DENSE_RANK обе оставляют одинаковые номера при равных значениях.
Продолжить в браузере

Ещё сравнения по теме