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
Subscribe ecode10.com
Receive our latest updates about programming languages, software, database, books, ebooks, classes, jobs and more.
You can cancel anytime.
Log In
Related articles
SELECT Format Date Time for many countries
It is a good tip to use day by day
Creating a SiteMap using SQL Database
Como indexar melhor meu site e links?
Transformando linhas em colunas usando SQL Server
veja como funciona