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