Funções da janela do servidor SQL RANK, DENSE_RANK e NTILE


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:

podemos escrever a seguinte consulta para testar as três funções de classificação:

Isso nos dá este conjunto de resultados:

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:

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:

Quando a adição de fileiras com o RANK e DENSE_RANK, temos o seguinte conjunto de dados:

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:

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *