Utilizando o Rank() e o Dense_Rank()

A função Rank permite que façamos a avaliação de ranking sobre um resultado de uma query.

Por exemplo, criei uma estrutura em uma tabela que possui os campos: cdcliente, nmcliente e nrnota onde nrnota é um valor atribuído ao cliente que vai de 1 à 10, esse valor é atribuído através do ERP que classifica baseado em diversas métricas.

Se eu quiser consultar os meus clientes montando um rank do cliente com melhor pontuação para o cliente com a pontuação mais baixa eu posso utilizar uma query com order by veja o exemplo:

SELECT nmcliente, nrnota FROM cliente ORDER BY nrnota desc

É fácil perceber que os três primeiros registros estão entre os clientes com melhor pontuação, porém, se quisermos que esse resultado possua uma coluna indicando qual a posição do meu cliente no ranking, igual ao ranking de vencedores de uma competição de natação onde eu tenho o primeiro lugar, segundo e terceiro.

SELECT nmcliente, nrnota, RANK() OVER(order BY nrnota desc) FROM Cliente ORDER BY nrnota desc 

Analise o resultado abaixo.

 

Na terceira coluna, utilizando a função rank eu criei a exibição do ranking dos meus clientes ordenados pelo cliente de maior pontuação para o cliente de menor.

Na próxima query eu vou retornar o top 3 dos meus clientes.

WITH RankCliente AS (
SELECT nmcliente, nrnota, RANK() OVER(order BY nrnota desc) AS ranking FROM Cliente)
SELECT * FROM RankCliente WHERE ranking <= 3 

Agora para dificultar um leitor do meu blog me enviou uma pergunta, como fazer ranking, porém o retorno ser em seqüência? A resposta é com o Dense_Rank veja o exemplo.

WITH RankCliente AS (
SELECT nmcliente, nrnota, 
    DENSE_RANK() OVER(order BY nrnota desc) AS ranking FROM Cliente)
SELECT * FROM RankCliente WHERE ranking <= 3

É fácil notar que o resultado da query a cima tem o mesmo filtro da enterior é o meu Top 3 de clientes, entretanto o retorno são 4 registros indicando os meus 4 clientes com melhor avaliação.

Pessoal era isso que eu tinha para falar sobre o Rank e o Dense_Rank, se ficaram algumas ou sugestões deixem seus comentários, ou enviem e-mails.

Abraço, Rodrigo.

2 comentários em “Utilizando o Rank() e o Dense_Rank()

  1. levei tempo tentando achar uma solução para o que eu precisava, e isso vei a cair como uma luva, parabéns.

Deixe uma resposta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.