En SQL Server, el NTILE()
La función le permite distribuir las filas en una partición ordenada en un número específico de grupos. Los grupos están numerados, comenzando en 1. Para cada fila, NTILE()
devuelve el número del grupo al que pertenece la fila.
Simplemente proporcione la cantidad de grupos que desea al llamar a la función.
Sintaxis
La sintaxis es así:
NTILE (integer_expression) OVER ( [] < order_by_clause > )
expresión_entera es una expresión entera positiva que especifica el número de grupos en los que se debe dividir cada partición. Puede ser de tipo int o bigint .
FROM
cláusula en particiones a las que se aplica la función.
NTILE()
los valores se asignan a las filas en una partición. Un entero no puede representar una columna cuando
Ejemplo 1:uso básico
Aquí hay un ejemplo básico que muestra cómo funciona esta función:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
Resultado:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 2 | | Marge | 990 | 2 | | Lisa | 710 | 3 | | Ned | 666 | 3 | | Apu | 350 | 4 | | Homer | 1 | 4 | +----------+---------+---------+
En este caso hay 8 resultados y el valor que proporciono a NTILE()
es 4, por lo que los valores se distribuyen uniformemente en 4 grupos.
Ejemplo 2:cambiar el valor NTILE
Esto es lo que sucede si cambio el NTILE()
valor a 3.
SELECT Player, Score, NTILE(3) OVER (ORDER BY Score DESC) 'NTILE' FROM Scoreboard;
Resultado:
+----------+---------+---------+ | Player | Score | NTILE | |----------+---------+---------| | Bart | 2010 | 1 | | Burns | 1270 | 1 | | Meg | 1030 | 1 | | Marge | 990 | 2 | | Lisa | 710 | 2 | | Ned | 666 | 2 | | Apu | 350 | 3 | | Homer | 1 | 3 | +----------+---------+---------+
Los resultados se distribuyen en 3 grupos. Como era de esperar, el último grupo termina con solo 2 filas (en comparación con las 3 de los otros grupos).
Ejemplo 3:cambia el orden
Cambiar el orden entre ascendente y descendente generalmente resultará en el NTILE()
valores que se aplican a diferentes filas.
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
Resultado:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 4 | | Burns | 1270 | 1 | 4 | | Meg | 1030 | 2 | 3 | | Marge | 990 | 2 | 3 | | Lisa | 710 | 3 | 2 | | Ned | 666 | 3 | 2 | | Apu | 350 | 4 | 1 | | Homer | 1 | 4 | 1 | +----------+---------+--------------------+-------------------+
Sin embargo, esto dependerá de cuántas filas haya en el conjunto de resultados frente a la cantidad de NTILE. Obviamente, si el NTILE()
valor es 1, entonces no habrá diferencia.
SELECT Player, Score, NTILE(1) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(1) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard ORDER BY Score DESC;
Resultado:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | | Burns | 1270 | 1 | 1 | | Meg | 1030 | 1 | 1 | | Marge | 990 | 1 | 1 | | Lisa | 710 | 1 | 1 | | Ned | 666 | 1 | 1 | | Apu | 350 | 1 | 1 | | Homer | 1 | 1 | 1 | +----------+---------+--------------------+-------------------+
Ocurrirá lo mismo si el conjunto de resultados contiene solo una fila, independientemente del NTILE()
valor:
SELECT Player, Score, NTILE(4) OVER (ORDER BY Score DESC) 'NTILE Descending', NTILE(4) OVER (ORDER BY Score ASC) 'NTILE Ascending' FROM Scoreboard WHERE Score > 2000 ORDER BY Score DESC;
Resultado:
+----------+---------+--------------------+-------------------+ | Player | Score | NTILE Descending | NTILE Ascending | |----------+---------+--------------------+-------------------| | Bart | 2010 | 1 | 1 | +----------+---------+--------------------+-------------------+
Ejemplo 4:Particiones
Puedes usar la PARTITION BY
cláusula para dividir los resultados en particiones. Cuando haces esto, NTILE()
se aplica contra cada partición.
Ejemplo:
SELECT TeamName, Player, Score, NTILE(2) OVER (PARTITION BY TeamName ORDER BY Score ASC) 'NTILE' FROM Scoreboard s INNER JOIN Team t ON t.TeamId = s.TeamId;
Resultado:
+------------+----------+---------+-------------------+ | TeamName | Player | Score | NTILE | |------------+----------+---------+-------------------| | Mongrels | Apu | 350 | 1 | | Mongrels | Ned | 666 | 1 | | Mongrels | Meg | 1030 | 2 | | Mongrels | Burns | 1270 | 2 | | Simpsons | Homer | 1 | 1 | | Simpsons | Lisa | 710 | 1 | | Simpsons | Marge | 990 | 2 | | Simpsons | Bart | 2010 | 2 | +------------+----------+---------+-------------------+