por: Koen Verbeeck
Overview
o tópico desta parte é sobre funções de ranking. Eles foram introduzidos no SQLServer 2005. ROW_NUMBER é também uma função de ranking, mas já foi coberta extensivamente na parte anterior deste tutorial.
RANK e DENSE_RANK
em contraste com a função ROW_NUMBER,RANK andDENSE_RANK não tem de gerar números únicos. A diferença entre todas estas funções é como eles lidam com laços.,
- ROW_NUMBER irá sempre gerar valores únicos sem quaisquer lacunas, mesmo que existam laços.
- RANK pode ter lacunas em sua sequência e quando os valores são os mesmos, eles têm o mesmo rank.
- DENSE_RANK também retorna o mesmo rank para gravatas, mas não tem quaisquer roteiros na sequência.
vamos ilustrar com um exemplo., Suponha que temos a seguinte samplevalues:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.001.png)
podemos escrever a seguinte consulta para testar as três funções de classificação:
Isso nos dá este conjunto de resultados:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.002.png)
Como você pode ver, CLASSIFICAÇÃO irá retornar o mesmo valor para laços. No entanto, o próximo grupo rankin A é o número 3, omitindo o rank 2. Por outro lado, o “DENSE_RANK” não se classifica como “rank 2”. Quando não há ligações no conjunto de recordes, todas as três funções de ranking revertem exactamente o mesmo resultado.,
com ROW_NUMBER e RANK, podemos criar uma construção alternativa para detectar duplicaterows. Com a mesma amostra de dados utilizada inpart 5 deste tutorial, nós podemos criar a seguinte consulta para localizar todos os rowsthat ter um duplicado de negócios-chave:
O conjunto de resultados:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.003.png)
Agora nós só precisamos filtrar registros onde a linha gerada pelo número (RID) isdifferent do rank (RankID). Isto vai devolver um registo do Bob, por isso sabemos que há um registo duplicado para aquele empregado.
quando usar o RANK ou o DENSE_RANK?,
conforme especificado anteriormente, o RANK pode ter lacunas na sequência e o DENSE_RANK não.suponha que você tenha a tarefa de encontrar os 5 melhores clientes de acordo com o valor das vendas.Com RANK, você pode classificar seus clientes e, em seguida, filtrar qualquer cliente com arank maior que 5. Se você fizesse o mesmo com o DENSE_RANK, você poderia acabar com mais de 6 clientes!,
Suponhamos que temos este conjunto de dados sobre nossos clientes:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.004.png)
Quando a adição de fileiras com o RANK e DENSE_RANK, temos o seguinte conjunto de dados:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.005.png)
Quando a filtragem no rank <= 5, você vai ter exatamente 5 linhas retornadas. No entanto, se você filtrar em denserank <= 5, você terá 6 linhas, que pode não ser o que você quer. Quanto mais empates, mais linhas DENSE_RANK pode retornar. Se o empate fosse exatamente na linha número 5, a função RANK também retornaria 6 linhas., Nesse caso, tens de”quebrar a gravata”. Você pode fazer isso usando o Row_ Numerofunction ou ordenando na coluna adicional.
NTILE
a última função ranking é um pouco especial. NTILE divide as fileiras em baldes de tamanho igual. Suponha que você tem 20 linhas e você especifica NTILE(2). Isto dar-vos-á 2 baldes com 10 filas cada. Ao usar NTILE (3), você recebe 2 baldes com 7 linhas e 1 balde com 6 linhas.,
Vamos reutilizar a consulta da seção anterior, mas adicionar um expressionusing NTILE:
se os seguintes resultados:
![](https://www.mssqltips.com/images_tutorials/9126_ranking-functions.006.png)
Um exemplo onde NTILE foi usado para dividir os dados em segmentos é descrito em thetipHow para criar um gráfico de mapa de calor no SQL Server Reporting Services 2016.,
Informações Adicionais
- Mais dicas sobre as funções de classificação:
- SQL Server 2005 e 2008 Funções de Classificação DENSE_RANK e NTILE
- SQL Server 2005 e 2008 Funções de Classificação Row_Number e Classificação
- Esquecido SQL Server Funções – VARP, SOUNDEX e NTILE
Última Actualização: 5/31/2018