Database
 sql >> Base de Dados >  >> RDS >> Database

Qual é a diferença entre RANK e DENSE_RANK no SQL?

Problema:


Você deseja comparar as classificações produzidas por RANK e DENSE_RANK e adicioná-los como novas colunas a uma tabela.

Exemplo:


Nosso banco de dados tem uma tabela chamada sales_assistant com dados nas seguintes colunas:id (chave primária), first_name , last_name , month e sold products .
id first_name last_name mês produtos vendidos
1 Lisa Preto 5 2300
2 Maria Jacobs 5 2400
3 Lisa Preto 6 2700
4 Maria Jacobs 6 2700
5 Alex Smith 6 2900
6 Maria Jacobs 7 1200
7 Lisa Preto 7 1200
8 Alex Smith 7 1000

Vamos exibir o nome e sobrenome de cada vendedor e o número de produtos vendidos. Também queremos classificá-los em termos do número de produtos vendidos em ordem decrescente.

Solução 1:

SELECT RANK() OVER(ORDER BY produtos vendidos DESC) AS r, DENSE_RANK() OVER(ORDER BY produtos vendidos DESC) AS dr, first_name, last_name, month, sell productsFROM sales_assistant;

Esta consulta retorna duas classificações:uma produzida por RANK e outro por DENSE_RANK . Qual é a diferença?

Simplificando, RANK pula o número de posições após os registros com o mesmo número de classificação. A classificação RANK_DENSE retorna números de posição de 1 a 6 porque não pula registros com o mesmo número de classificação:
r dr first_name last_name mês produtos vendidos
1 1 Alex Smith 6 2900
2 2 Lisa Preto 6 2700
2 2 Maria Jacobs 6 2700
4 3 Maria Jacobs 5 2400
5 4 Lisa Preto 5 2300
6 5 Maria Jacobs 7 1200
6 5 Lisa Preto 7 1200
8 6 Alex Smith 7 1000

Discussão:


Se você deseja classificar linhas no conjunto de resultados, o SQL oferece o RANK() e DENSE_RANK funções. Estas funções são usadas em SELECT com outras colunas. Após RANK ou DENSE_RANK , chamamos o OVER() função, que recebe um ORDER BY cláusula com o nome da coluna para classificar antes de atribuir uma classificação.

Ao contrário de DENSE_RANK , RANK pula posições após classificações iguais. O número de posições ignoradas depende de quantas linhas tinham uma classificação idêntica. Por exemplo, Mary e Lisa venderam o mesmo número de produtos e ambas estão classificadas como número 2. Com RANK , a próxima posição é #4; com DENSE_RANK , a próxima posição é #3.

Ambos RANK e RANK_DENSE trabalhar em partições de dados:

Solução 1:

SELECT RANK() OVER(PARTITION BY mês ORDER BY produtos vendidos DESC) AS r, DENSE_RANK() OVER(PARTITION BY mês ORDER BY produtos vendidos DESC) AS dr, first_name, last_name, month, sell productsFROM sales_assistant; 
Você pode dividir os registros em grupos de acordo com uma determinada coluna (no nosso exemplo, month ). Nessa situação, os registros são classificados como parte de uma partição:
r dr first_name last_name mês produtos vendidos
1 1 Maria Jacobs 5 2400
2 2 Lisa Preto 5 2300
1 1 Alex Smith 6 2900
2 2 Lisa Preto 6 2700
2 2 Maria Jacobs 6 2700
1 1 Maria Jacobs 7 1200
1 1 Lisa Preto 7 1200
3 2 Alex Smith 7 1000