Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como NTILE() funciona no SQL Server


No SQL Server, o NTILE() A função permite distribuir as linhas em uma partição ordenada em um número especificado de grupos. Os grupos são numerados, começando em 1. Para cada linha, NTILE() retorna o número do grupo ao qual a linha pertence.

Você simplesmente fornece o número de grupos que deseja ao chamar a função.


Sintaxe


A sintaxe fica assim:
NTILE (expressão_inteiro) OVER ( [  ]  )

expressão_inteiro é uma expressão de número inteiro positivo que especifica o número de grupos em que cada partição deve ser dividida. Pode ser do tipo int , ou grande .

é opcional. Ele divide o conjunto de resultados produzido pelo FROM cláusula em partições às quais a função é aplicada.

É necessário. Ele determina a ordem na qual o NTILE() os valores são atribuídos às linhas em uma partição. Um número inteiro não pode representar uma coluna quando o é usado em uma função de classificação.

Exemplo 1 – Uso básico


Aqui está um exemplo básico mostrando como essa função funciona:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE'FROM Placar;

Resultado:
+----------+---------+---------+| Jogador | Pontuação | NTIL ||----------+---------+---------|| Bart | 2010 | 1 || Queimaduras | 1270 | 1 || Meg | 1030 | 2 || Margem | 990 | 2 || Lisa | 710 | 3 || Ned | 666 | 3 || Apu | 350 | 4 || Homero | 1 | 4 |+----------+---------+---------+

Neste caso existem 8 resultados e o valor que forneço para NTILE() é 4, então os valores são distribuídos uniformemente em 4 grupos.

Exemplo 2 – Alterar o valor NTILE


Aqui está o que acontece se eu alterar o NTILE() valor para 3.
SELECT Player, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE'FROM Placar;

Resultado:
+----------+---------+---------+| Jogador | Pontuação | NTIL ||----------+---------+---------|| Bart | 2010 | 1 || Queimaduras | 1270 | 1 || Meg | 1030 | 1 || Margem | 990 | 2 || Lisa | 710 | 2 || Ned | 666 | 2 || Apu | 350 | 3 || Homero | 1 | 3 |+----------+---------+---------+

Os resultados são distribuídos em 3 grupos. Como você pode esperar, o último grupo acaba com apenas 2 linhas (em comparação com 3 para os outros grupos).

Exemplo 3 – Mudar a ordenação


Alternar a ordem entre ascendente e descendente geralmente resultará no NTILE() valores sendo aplicados a diferentes linhas.
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;

Resultado:
+----------+---------+-------------------+---- ---------------+| Jogador | Pontuação | NTILE Descendente | NTILE Ascendente ||----------+---------+------+---- ---------------|| Bart | 2010 | 1 | 4 || Queimaduras | 1270 | 1 | 4 || Meg | 1030 | 2 | 3 || Margem | 990 | 2 | 3 || Lisa | 710 | 3 | 2 || Ned | 666 | 3 | 2 || Apu | 350 | 4 | 1 || Homero | 1 | 4 | 1 |+----------+---------+--------------------+----- --------------+

No entanto, isso dependerá de quantas linhas estão no conjunto de resultados versus o número de NTILES. Obviamente, se o NTILE() valor é 1, então não haverá diferença.
SELECT Player, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardORDER BY Score DESC;

Resultado:
+----------+---------+-------------------+---- ---------------+| Jogador | Pontuação | NTILE Descendente | NTILE Ascendente ||----------+---------+------+---- ---------------|| Bart | 2010 | 1 | 1 || Queimaduras | 1270 | 1 | 1 || Meg | 1030 | 1 | 1 || Margem | 990 | 1 | 1 || Lisa | 710 | 1 | 1 || Ned | 666 | 1 | 1 || Apu | 350 | 1 | 1 || Homero | 1 | 1 | 1 |+----------+---------+--------------------+----- --------------+

A mesma coisa acontecerá se o conjunto de resultados contiver apenas uma linha, independentemente do NTILE() valor:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending'FROM ScoreboardWHERE Score> 2000ORDER BY Score DESC; 
Resultado:
+----------+---------+-------------------+---- ---------------+| Jogador | Pontuação | NTILE Descendente | NTILE Ascendente ||----------+---------+------+---- ---------------|| Bart | 2010 | 1 | 1 |+----------+---------+--------------------+----- --------------+

Exemplo 4 – Partições


Você pode usar a PARTITION BY cláusula para dividir os resultados em partições. Ao fazer isso, NTILE() é aplicado em cada partição.

Exemplo:
SELECT TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE'FROM Scoreboard sINNER JOIN Team tON t.TeamId =s.TeamId;

Resultado:
+------------+----------+---------+------------ -------+| TeamName | Jogador | Pontuação | NTILE ||------------+----------+---------+------------- ------|| Mestiços | Apu | 350 | 1 || Mestiços | Ned | 666 | 1 || Mestiços | Meg | 1030 | 2 || Mestiços | Queimaduras | 1270 | 2 || Simpsons | Homero | 1 | 1 || Simpsons | Lisa | 710 | 1 || Simpsons | Margem | 990 | 2 || Simpsons | Bart | 2010 | 2 |+------------+----------+---------+------------- ------+