Funções RANK, DENSE_RANK, NTILE e ROW_NUMBER
Funções e classificação ou ranking.
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
Related articles
In SQL Server, there is no single UPDATE SELECT...
Database function function and function
Commit and Rollback command
how to do it in SQL language?
Na prática com exemplo real
It is a good tip to use day by day
Como indexar melhor meu site e links?