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 |