Compartilhar via


Funções RANK, DENSE_RANK, NTILE e ROW_NUMBER

Neste Post destacaremos as Funções de Classificação ou Ranking Functions.
Para entender melhor este Post é necessário já conhecer o comando OVER (explicado no post anterior).
São 4 funções: RANK, DENSE_RANK, NTILE e ROW_NUMBER.

Para exemplificar vamos utilizar o cenário de uma empresa de atendimento.

Create Table #Atendimento
(
Atendente varchar(10),
DataHora smalldatetime
)
INSERT INTO #Atendimento VALUES(‘Carlos’,’20120116 12:35′),(‘Carlos’,’20120116 12:39′),(‘Carlos’,’20120116 12:46′),(‘Carlos’,’20120116 12:54′)
INSERT INTO #Atendimento VALUES(‘João’,’20120116 08:32′),(‘João’,’20120116 08:47′),(‘João’,’20120116 08:59′)
INSERT INTO #Atendimento VALUES(‘José’,’20120116 08:51′),(‘José’,’20120116 08:58′)
INSERT INTO #Atendimento VALUES(‘Paulo’,’20120116 09:14′),(‘Paulo’,’20120116 09:23′),(‘Paulo’,’20120116 09:34′),(‘Paulo’,’20120116 09:43′)
INSERT INTO #Atendimento VALUES(‘Marcos’,’20120116 11:18′)
INSERT INTO #Atendimento VALUES(‘Lucas’,’20120116 08:13′),(‘Lucas’,’20120116 08:41′)

O diretor precisa de uma lista dos atendentes, criando um ranking por número de atendimentos.

Os 2 melhores atendentes estão empatados em 1º lugar.
O próximo atendente, se você considera que está em 3º lugar, então utilize a função RANK. Se você considera que está em 2º lugar, então utilize a runção DENSE_RANK.

A função ROW_NUMBER irá criar uma sequência numérica.

Observe na tabela abaixo o resultado destas 3 funções:

SELECT ROW_NUMBER() OVER (ORDER BY COUNT(1) desc) ID,
Atendente,
COUNT(1) Quantidade,
RANK() OVER (ORDER BY COUNT(1) desc) PosiçãoRANK,
DENSE_RANK() OVER (ORDER BY COUNT(1) desc) PosiçãoDENSERANK
FROM #Atendimento
GROUP by Atendente

OU

SELECT ROW_NUMBER() OVER (ORDER BY Quantidade desc) ID,
Atendente,
Quantidade,
RANK() OVER (ORDER BY Quantidade desc) PosiçãoRANK,
DENSE_RANK() OVER (ORDER BY Quantidade desc) PosiçãoDENSERANK
FROM (
              SELECT Atendente, COUNT(1) Quantidade
              FROM #Atendimento
              GROUP BY Atendente
) Tab

A função NTILE, divide o resultado em grupos e identifica cada grupo com um sequencial.
A quantidade de grupo será de acordo com o parâmetro informado na função.
Numa divisão não exata os primeiros grupos ficarão com mais membros.
Exemplo: NTILE(4) para 20 registros – 4 grupos de 5 registros
                 NTILE(4) para 21 registros – 1º grupo com 6 registros e demais 3 grupos com 5 registros

Vamos dividir os Atendentes em 2 Equipes:

SELECT Atendente, Quantidade,
NTILE(2) OVER(ORDER BY Quantidade desc) EQUIPE
FROM (
             SELECT Atendente, COUNT(1) Quantidade
             FROM #Atendimento
            GROUP BY Atendente
) Tab

Apagar a Tabela Temporária

DROP TABLE #Atendimento

Até o próximo Post.