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 |