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

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

Если коротко. При ничьей RANK ставит обоим один номер и пропускает следующий (1,1,3), DENSE_RANK идёт подряд (1,1,2).
Проверь себя · 1/3разбор после ответа
В таблице платежей нужно вывести для каждой транзакции накопительную сумму платежей пользователя на этот момент (running total). Какое выражение даст накопительный итог по пользователю?

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 обе оставляют одинаковые номера при равных значениях.
Тренировать SQL в Telegram

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