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 .
FROM
cláusula em partições às quais a função é aplicada. 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 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 aPARTITION 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 |+------------+----------+---------+------------- ------+