Функции RANK и DENSE_RANK
Часть раздела Основы путешествия по SQL на Coddy — урок 65 из 72.
ROW_NUMBER() — это один тип функции ранжирования, и есть еще два: RANK() и DENSE_RANK().
Функция RANK() нумерует строки подобно ROW_NUMBER(), но присваивает одинаковые номера одинаковым строкам и пропускает номера. DENSE_RANK() похожа на RANK(), но не пропускает номера.
Например:
| ид | уровень |
| 1 | 5 |
| 2 | 6 |
| 3 | 6 |
| 4 | 7 |
| 5 | 7 |
| 6 | 5 |
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Это вернёт:
| id | row_num | row_rank | row_dense_rank |
| 1 | 1 | 1 | 1 |
| 6 | 2 | 1 | 1 |
| 2 | 3 | 3 | 2 |
| 3 | 4 | 3 | 2 |
| 4 | 5 | 5 | 3 |
| 5 | 6 | 5 | 3 |
Объяснение:
ROW_NUMBER(): Всегда уникально: 1, 2, 3, 4, 5, 6RANK():- уровень 5 (2 строки): оба получают ранг 1
- уровень 6 (2 строки): оба получают ранг 3 (пропускает 2)
- уровень 7 (2 строки): оба получают ранг 5 (пропускает 4)
DENSE_RANK():- уровень 5 (2 строки): оба получают ранг 1
- уровень 6 (2 строки): оба получают ранг 2 (без пропуска)
- уровень 7 (2 строки): оба получают ранг 3 (без пропуска)
Задание
ЛегкоДоступные таблицы и столбцы:
<strong>medals</strong>:<strong>region</strong>,<strong>medal_color</strong>,<strong>medal_count</strong>
Создайте запрос, который показывает регион, общее количество медалей (сумма всех медалей независимо от цвета) и два типа рангов:
regular_rank(с пропусками) по сумме медалейdense_rank(без пропусков) по сумме медалей
Сортировать результат по:
order by total_medals desc, region ascШпаргалка
SQL предоставляет три функции ранжирования, которые по-разному ведут себя при наличии одинаковых значений:
ROW_NUMBER()— присваивает уникальные последовательные номераRANK()— присваивает одинаковый ранг одинаковым значениям и пропускает последующие рангиDENSE_RANK()— присваивает одинаковый ранг одинаковым значениям без пропуска рангов
Например:
| id | level |
| 1 | 5 |
| 2 | 6 |
| 3 | 6 |
| 4 | 7 |
| 5 | 7 |
| 6 | 5 |
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Это вернёт:
| id | row_num | row_rank | row_dense_rank |
| 1 | 1 | 1 | 1 |
| 6 | 2 | 1 | 1 |
| 2 | 3 | 3 | 2 |
| 3 | 4 | 3 | 2 |
| 4 | 5 | 5 | 3 |
| 5 | 6 | 5 | 3 |
Попробуйте сами
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Больше ключевых слов
Ключевое слово INКлючевое слово BETWEENКлючевое слово LIKEКлючевое слово ASПовторение - Модели мобильных телефонов2Условия
Основы условийКлючевое слово ANDКлючевое слово ORКлючевое слово NOTКомбинирование нескольких условийСкобкиБулевы значения5Арифметические операции
Математические операторыМатематические столбцыОперация moduloФункция ROUND()3Специальный формат возврата
Значения NULLСортировка результатов, часть 1Сортировка результатов, часть 2Повторение - Фирма по кибербезопасностиОграничение количества записейПовторение - Автозавод6Вводные вызовы
Повторение - Парламентские выборыПовторение - Арест преступника полициейПовторение - Ёмкость для напитков в бареПовторение - Создание новых столбцов9Несколько таблиц
Базовый JOIN, Часть 1Базовый JOIN, Часть 2Повторение - JOINСамосоединениеПовторение - СамосоединениеОбъединениеУпрощение запросов, ключевое слово WITHПовторение - Запросы WITHПовторение - Подрядчик по недвижимости12Оконные функции, часть 2
Функции RANK и DENSE_RANKПовторение - RANK и DENSE_RANKФункция NTILEАгрегатные функцииКритерии ROWS и RANGE