Menu
Coddy logo textTech

Функции RANK и DENSE_RANK

Часть раздела Основы путешествия по SQL на Coddy — урок 65 из 72.

ROW_NUMBER() — это один тип функции ранжирования, и есть еще два: RANK() и DENSE_RANK().

Функция RANK() нумерует строки подобно ROW_NUMBER(), но присваивает одинаковые номера одинаковым строкам и пропускает номера. DENSE_RANK() похожа на RANK(), но не пропускает номера.

Например:

идуровень
15
26
36
47
57
65
SELECT id, 
	ROW_NUMBER() OVER (ORDER BY level) as row_num,
	RANK() OVER (ORDER BY level) as row_rank,
	DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1

Это вернёт:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

Объяснение:

  • ROW_NUMBER(): Всегда уникально: 1, 2, 3, 4, 5, 6
  • RANK():
    • уровень 5 (2 строки): оба получают ранг 1
    • уровень 6 (2 строки): оба получают ранг 3 (пропускает 2)
    • уровень 7 (2 строки): оба получают ранг 5 (пропускает 4)
  • DENSE_RANK():
    • уровень 5 (2 строки): оба получают ранг 1
    • уровень 6 (2 строки): оба получают ранг 2 (без пропуска)
    • уровень 7 (2 строки): оба получают ранг 3 (без пропуска)
challenge icon

Задание

Легко

Доступные таблицы и столбцы:

  • <strong>medals</strong>: <strong>region</strong>, <strong>medal_color</strong>, <strong>medal_count</strong>

Создайте запрос, который показывает регион, общее количество медалей (сумма всех медалей независимо от цвета) и два типа рангов:

  1. regular_rank (с пропусками) по сумме медалей
  2. dense_rank (без пропусков) по сумме медалей

Сортировать результат по:

order by total_medals desc, region asc

Шпаргалка

SQL предоставляет три функции ранжирования, которые по-разному ведут себя при наличии одинаковых значений:

  • ROW_NUMBER() — присваивает уникальные последовательные номера
  • RANK() — присваивает одинаковый ранг одинаковым значениям и пропускает последующие ранги
  • DENSE_RANK() — присваивает одинаковый ранг одинаковым значениям без пропуска рангов

Например:

idlevel
15
26
36
47
57
65
SELECT id, 
	ROW_NUMBER() OVER (ORDER BY level) as row_num,
	RANK() OVER (ORDER BY level) as row_rank,
	DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1

Это вернёт:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

Попробуйте сами

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы