Quieres saber más sobre NTILE()
Estaba leyendo sobre la función de CLASIFICACIÓN para ms sql. Entiendo las otras funciones excepto NTILE (). Digamos que si tengo estos datos:
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)
?
¿Alguna explicación sencilla?
5 answers
Piense en ello como cubos, NTILE (2) hará 2 cubos, la mitad de las filas tendrá 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á la salida, ya que tiene un número desigual 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 código de producción, pero puedo ver el uso donde necesita dividir los resultados en n número de cubos
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-16 09:51:23
Organizará los datos en orden descendente de marcas y luego los dividirá en 2 grupos.
Si los datos no se pueden dividir en grupos iguales, entonces 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) le dará
StudentID MARKS NTILE
S5 93 1
S3 91 1
S2 83 2
S4 83 2
S1 75 3
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-16 09:54:42
Uso NTILE con bastante frecuencia para dividir las listas de correo electrónico en cubos para las pruebas 10/10/80. Por ejemplo, estamos probando una línea de asunto de un correo electrónico, y queremos enviar una de las dos opciones al 10% de cada una de la lista, con la que funciona mejor se envía al 80% restante.
SELECCIONE [lista de campos], (NTILE(10) OVER (order by newid ())) -1 COMO Segmento DE [datos]
El "order by newid()" asegura un orden aleatorio. El " [NTILE ...] -1" la sintaxis es un resultado directo de algunos de los otros herramientas que utilizamos haciendo análisis de texto en lugar de matemáticas de enteros, por lo que era más fácil que los resultados se ejecutaran desde 0-9 en lugar de 1-10. El campo de segmento se rellenará 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, necesitará usar algo determinista en la cláusula "order by", o agregar una columna con un GUID para usar para el order by clausula.
La cláusula PARTITION BY se usaría para crear grupos de buckets basados en el estado, o profesión, o algún otro agrupamiento predeterminado, es decir, NTILE(10) OVER (PARTITION BY State ORDER BY newid()) o algo así. Creo que la cláusula ORDER BY es necesaria - la PARTICIÓN BY es opcional.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-09 16:12:23
En la función Ntile primero cuenta el número de filas y lo divide por el parámetro pasado en ntile y luego hace un grupo igual de filas de acuerdo con el cociente y las clasifica y luego las filas restantes se distribuirán por cada grupo desde la parte superior de una manera cambiante y no lo tomará de las menos filas, por ejemplo, si group1 tiene 4 filas, entonces tomará la 5ª fila en su grupo, no la última fila.
Gracias
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 08:44:09
Ntile sin usar la cláusula de partición, simplemente divida el conjunto de datos basado en el número en el ntile(número) de tal manera que : si no de filas son 7, ejemplo: 1,1,1,2,3,4,5 ntile(3) dará 3,2,2. ¿Cómo conseguí 3,2,2?. En primer lugar asumir 7 como 6 (uno menos para que sea incluso), 6/3 da 2,2,2 , a continuación, añadir +! a la primera partición. Si el no.de filas son incluso entonces no hay problema. simplemente divida el conjunto de datos
Ntile usando la cláusula de partición, simplemente divida el conjunto de datos en función de los valores en el conjunto de datos de tal manera que: de filas son 7, los valores de fila de ejemplo son: 1,1,1,2,3,4,5 entonces: ntile (3) particionado 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 un partiton, luego todos los valores forman una partición diferente. A continuación, comience a asignar el rango ntile a cada partición. Aquí, 1,1,1 se convertirá en 1,2,3 luego continúe con la siguiente partición, puede tirar del rango solo hasta el número especificado en la función ntile ()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-09 07:25:06