Проблем:
Искате да сравните класациите, направени от 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 |