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_NUMBER1, 2, 3, 4 (уникальные номера, равенство игнорируется);
  • RANK1, 2, 2, 4 (равные получают одинаковый ранг, следующий пропускается);
  • DENSE_RANK1, 2, 2, 3 (без пропусков).

ROW_NUMBER удобно для dedup (через CTE + WHERE rn = 1), DENSE_RANK — когда важен номер «места» без дыр.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.