Database
 sql >> база данни >  >> RDS >> Database

Каква е разликата между RANK и DENSE_RANK в SQL?

Проблем:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Въведение в Azure без сървър

  2. SQL SELECT MAX

  3. Проследяване на високи CLR_MANUAL_EVENT изчаквания

  4. Често срещани задачи на Postgres на CentOS 7

  5. Как да използвам клауза ORDER BY в SQL?