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.

Author: SQLCrespi

Rodrigo Crespi é MVP Data Platform, MCT, MCSE, MCSA, MCIT, MCDBA e MCP em SQL Server, possuí outras certificações em .NET Framework, Dynamics CRM e etc. Iniciou trabalhando com SQL Server na versão 6.5 na época como desenvolvedor, logo direcionou a sua carreira para a área de administração de bancos de dados. Atualmente é Sócio da CrespiDB – Soluções em Plataformas de Dados, além de professor universitário na Uniftec – Caxias do Sul Autor de diversos artigos publicados em sites e revistas sobre SQL Server e engenharia de software, mantem o canal SQLCrespi no Youtube, o blog SQLCrespi, além de ser dedicado ao SQL Server RS PASS Chapter Leader do grupo de profissionais em SQL Server do Rio Grande do Sul.

2 thoughts on “Utilizando o Rank() e o Dense_Rank()

Deixe uma resposta