ntile - sql server rank() over
Desea obtener más información sobre NTILE() (5)
Arreglará los datos en orden descendente de marcas y luego los dividirá en 2 grupos.
Si los datos no se pueden dividir en grupos iguales, los primeros grupos tendrán más filas que los últimos grupos.
Así que NTILE (2) te dará
StudentID MARKS NTILE
S5 93 1
S3 91 1
S2 83 1
S4 83 2
S1 75 2
Del mismo modo, NTILE (3) te dará
StudentID MARKS NTILE
S5 93 1
S3 91 1
S2 83 2
S4 83 2
S1 75 3
Estaba leyendo sobre la función RANKING para ms sql. Entiendo la función de los demás excepto NTILE (). Digamos si tengo esta información:
StudentID MARKS
S1 75
S2 83
S3 91
S4 83
S5 93
Entonces, si hago un NTILE(2) OVER(ORDER BY MARKS desc)
¿cuál será el resultado y por qué?
¿Y si es un NTILE(3)
? ¿Explicación simple a alguien?
En la función Ntile, primero cuenta el número de filas y lo divide por el parámetro pasado en ntile y luego crea un grupo igual de filas según el cociente y las clasifica, y luego las filas restantes se distribuirán por cada grupo desde arriba de forma variable y no lo tomará de las filas más pequeñas; por ejemplo, si group1 tiene 4 filas, tomará la 5ª fila en su grupo, no la última.
Gracias
Piense en ello como cubos, NTILE (2) hará 2 cubos, la mitad de las filas tendrán el valor 1 y la otra mitad el valor 2
ejemplo
create table #temp(StudentID char(2), Marks int)
insert #temp values(''S1'',75 )
insert #temp values(''S2'',83)
insert #temp values(''S3'',91)
insert #temp values(''S4'',83)
insert #temp values(''S5'',93 )
select NTILE(2) over(order by Marks),*
from #temp
order by Marks
Aquí está el resultado, ya que tiene un número impar de filas, el cubo 1 tendrá 1 fila más
1 S1 75
1 S2 83
1 S4 83
2 S3 91
2 S5 93
Si agrega una fila más
insert #temp values(''S6'',92 )
Ahora ambos cubos tienen 3 filas
1 S1 75
1 S2 83
1 S4 83
2 S3 91
2 S6 92
2 S5 93
En realidad, nunca he usado NTILE en el código de producción, pero puedo ver el uso donde se deben dividir los resultados en n cantidad de cubos
Sin usar una cláusula de partición, solo divida el conjunto de datos en función del número en el ntile (número) de modo que: si no hay filas en 7, por ejemplo: 1,1,1,2,3,4,5 ntile (3) dar 3,2,2. ¿Cómo obtuve 3,2,2? Primero asuma 7 como 6 (uno menos para igualar), 6/3 da 2,2,2, luego agregue +! a la primera partición. Si el n. ° de filas es par, entonces no hay problema. solo divide el conjunto de datos
Ntile usando una cláusula de partición, solo divida el conjunto de datos en base a los valores en el conjunto de datos de modo que: si no hay filas en 7, los valores de fila de ejemplo son: 1,1,1,2,3,4,5 y luego: ntile (3) particionados por valor dará: 1,2,3,1,1,1,1. ¿Cómo conseguí esto? Primero rompa el conjunto de datos basado en valores: aquí, 1,1,1 es una partición, luego todos los valores forman una partición diferente. Luego comience a asignar rango ntile a cada partición. Aquí, 1,1,1 se convertirá en 1,2,3 y luego continuará con la siguiente partición, puede obtener el rango solo hasta el número especificado en la función ntile ()
Uso NTILE con bastante frecuencia para dividir listas de correo electrónico en cubos para pruebas 10/10/80. Por ejemplo, estamos probando una línea de asunto de un correo electrónico, y queremos enviar una de dos opciones al 10% de cada una de la lista, y la que tiene un mejor rendimiento se envía al 80% restante.
SELECCIONAR [lista de campos], (NTILE (10) OVER (ordenar por newid ())) - 1 AS Segment FROM [data]
El "orden por newid ()" asegura un orden aleatorio. La sintaxis "[NTILE ...] - 1" es un resultado directo de algunas de las otras herramientas que usamos para analizar texto en lugar de matemáticas enteras, por lo que era más fácil que los resultados se ejecutaran de 0-9 en lugar de 1-10. . El campo de segmento se completará con un valor de 0-9 que puedo usar para separar el 10% de los registros con bastante facilidad, y más de una vez para campañas con múltiples esfuerzos para ellos.
Si necesita una consulta con resultados replicables, debería usar algo determinista en la cláusula "ordenar por", o agregar una columna con un GUID para usar para la cláusula order by.
La cláusula PARTITION BY se usaría para crear grupos de categorías en función del estado, la profesión o alguna otra agrupación predeterminada, es decir, NTILE (10) OVER (PARTITION BY State ORDER BY newid ()) o algo así. Creo que se requiere la cláusula ORDER BY: la PARTITION BY es opcional.