Проблем:
Искате да сравните класациите, направени от RANK
и DENSE_RANK
и ги добавете като нови колони към таблица.
Пример:
Нашата база данни има таблица с име sales_assistant
с данни в следните колони:id
(първичен ключ), first_name
, last_name
, month
и sold products
.
id | first_name | фамилно_име | месец | продадени продукти |
---|---|---|---|---|
1 | Лиза | Черно | 5 | 2300 |
2 | Мери | Джейкъбс | 5 | 2400 |
3 | Лиза | Черно | 6 | 2700 |
4 | Мери | Джейкъбс | 6 | 2700 |
5 | Алекс | Смит | 6 | 2900 |
6 | Мери | Джейкъбс | 7 | 1200 |
7 | Лиза | Черно | 7 | 1200 |
8 | Алекс | Смит | 7 | 1000 |
Нека покажем името и фамилията на всеки търговски асистент и броя на продадените продукти. Също така искаме да ги класираме по отношение на броя на продадените продукти в низходящ ред.
Решение 1:
ИЗБЕРЕТЕ RANK() НАД (ПОРЪЧКА ПО продадени продукти DESC) КАТО r, DENSE_RANK() НАД (ПОРЪЧКА ПО продадени продукти DESC) AS dr, име, фамилия, месец, продадени продуктиFROM sales_assistant;
Тази заявка връща две класации:едната, произведена от RANK
и друг от DENSE_RANK
. Каква е разликата?
Просто казано, RANK
пропуска броя на позициите след записи със същия номер на ранг. Класирането RANK_DENSE
връща номера на позиции от 1 до 6, защото не пропуска записи със същия номер на ранг:
r | д-р | first_name | фамилно_име | месец | продадени продукти |
---|---|---|---|---|---|
1 | 1 | Алекс | Смит | 6 | 2900 |
2 | 2 | Лиза | Черно | 6 | 2700 |
2 | 2 | Мери | Джейкъбс | 6 | 2700 |
4 | 3 | Мери | Джейкъбс | 5 | 2400 |
5 | 4 | Лиза | Черно | 5 | 2300 |
6 | 5 | Мери | Джейкъбс | 7 | 1200 |
6 | 5 | Лиза | Черно | 7 | 1200 |
8 | 6 | Алекс | Смит | 7 | 1000 |
Дискусия:
Ако искате да класирате редове в набора от резултати, SQL предлага RANK()
и DENSE_RANK
функции. Тези функции се използват в SELECT
с други колони. След RANK
или DENSE_RANK
, ние наричаме OVER()
функция, която приема ORDER BY
клауза с името на колоната за сортиране, преди да се присвои класиране.
За разлика от DENSE_RANK
, RANK
пропуска позиции след равно класиране. Броят на пропуснатите позиции зависи от това колко реда са имали идентично класиране. Например Мери и Лиза продадоха същия брой продукти и двете са класирани като #2. С RANK
, следващата позиция е #4; с DENSE_RANK
, следващата позиция е #3.
И двата RANK
и RANK_DENSE
работа върху дялове на данни:
Решение 1:
ИЗБЕРЕТЕ RANK() OVER(РАЗДЕЛЕНИЕ ПО месец ПОРЪЧКА ПО ПРОДАДЕНИ продукти DESC) КАТО r, DENSE_RANK() НАД (РАЗДЕЛЕНИЕ ПО месец ПОРЪЧКА ПО продадени продукти DESC) AS dr, име, фамилия, месец, продадени продуктиFROM sales_assistant;предварително>Можете да разделите записи на групи според дадена колона (в нашия пример
month
). В тази ситуация записите се класират като част от дял:
r | д-р | first_name | фамилно_име | месец | продадени продукти |
---|---|---|---|---|---|
1 | 1 | Мери | Джейкъбс | 5 | 2400 |
2 | 2 | Лиза | Черно | 5 | 2300 |
1 | 1 | Алекс | Смит | 6 | 2900 |
2 | 2 | Лиза | Черно | 6 | 2700 |
2 | 2 | Мери | Джейкъбс | 6 | 2700 |
1 | 1 | Мери | Джейкъбс | 7 | 1200 |
1 | 1 | Лиза | Черно | 7 | 1200 |
3 | 2 | Алекс | Смит | 7 | 1000 |