Mediumrank
Чем RANK от ROW_NUMBER и DENSE_RANK?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Все три нумеруют строки, но по-разному обрабатывают равные значения (ties) в ORDER BY.
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
RANK() OVER (ORDER BY salary DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
FROM employees;Для зарплат 100, 90, 90, 80:
- ROW_NUMBER —
1, 2, 3, 4(уникальные номера, равенство игнорируется); - RANK —
1, 2, 2, 4(равные получают одинаковый ранг, следующий пропускается); - DENSE_RANK —
1, 2, 2, 3(без пропусков).
ROW_NUMBER удобно для dedup (через CTE + WHERE rn = 1), DENSE_RANK — когда важен номер «места» без дыр.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.