Veja o script com os exemplos no github.
1º) Exemplo:
Queremos exibir a classificação dos atletas em uma corrida de acordo com o tempo gasto para completar a prova.
Para exibir a classificação vamos utilizar a tabela "tb_corrida" exibida abaixo:
Solução:
Para exibir a posição dos corredores utilizamos a sentença abaixo:
SELECT
DENSE_RANK() OVER(ORDER BY tempo_gasto ASC) AS posicao,
inscricao,
tempo_gasto,
sexo
FROM tb_corrida
Após a execução da sentença acima, teremos o seguinte resultado:
Observações
- Utilizamos DENSE_RANK sobre a coluna que queremos obter a classificação, neste caso "tempo_gasto".
- Observe que DENSE_RANK esta acompanhado de "OVER", e dentro do "OVER" vamos colocar a coluna que vamos utilizar para obter as posições e de que maneira queremos a classificação "ASC" - crescente (do valor mais baixo até o valor mais alto) ou "DESC" - decrescente (do valor mais alto até o valor mais baixo).
2º) Exemplo:
Queremos a classificação dos corredores separadas pelo sexo (masculino e feminino). Vamos utilizar a mesma tabela do primeiro exemplo, "tb_corrida":
Solução:
Para exibir a posição dos corredores separadas por sexo utilizamos a sentença abaixo:
SELECT
DENSE_RANK() OVER(PARTITION BY sexo ORDER BY tempo_gasto ASC) AS posicao,
inscricao,
tempo_gasto,
sexo
FROM tb_corrida
Após a execução da sentença acima, teremos o seguinte resultado:
Repare que a única alteração que fizemos foi incluir "PARTITION BY" dentro do OVER.
Após o PARTITION BY incluímos a coluna sexo, pois queremos que a classificação seja dividida por sexo.
3º) Exemplo:
Queremos a classificação dos vendedores em uma loja de acordo com o total das vendas.
Para exibir a classificação vamos utilizar a tabela "tb_vendas" exibida abaixo:
Solução:
Para exibir a classificação dos vendedores de acordo com o total das vendas executamos a sentença a seguir:
SELECT
codigo_vendedor,
SUM(valor),DENSE_RANK() OVER(ORDER BY SUM(valor) DESC) AS posicao
FROM tb_vendas
GROUP BY codigo_vendedor
Após a execução da sentença acima, teremos o seguinte resultado:
Repare que utilizamos a função da agrupamento SUM dentro do OVER para que fossem classificadas as somas do valores (e não os valores individualmente) e utilizamos o "GROUP BY" para agrupar as somas por código do vendedor. Além disso utizamos o "ORDER BY" com DESC para agrupar da soma com maior valor até a soma com menor valor.
A função dense_rank pertence ao grupo de funções chamadas "window functions". Existem outras funções desse tipo, em breve publicaremos outras funções.
Deixe suas sugestões ou críticas.