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: таблица различий
Когда использовать RANK
- Нужна классическая «спортивная» нумерация с пропусками (5 человек — 1, 2, 2, 4, 5).
- Хотите сразу видеть, что были ничьи — пропуск это сигналит.
- Когда формат отчёта требует «реального» места.
Когда использовать DENSE_RANK
- Нужны последовательные «плотные» уровни без дыр (1, 2, 2, 3, 4).
- Группируете данные на N уровней по плотным позициям (топ-3 уровня дохода).
- Хотите упростить дальнейшую агрегацию — без пропусков считать проще.
На примере
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 обе оставляют одинаковые номера при равных значениях.