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?

Author: Rahul Singh, 2013-01-16

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

 37
Author: SQLMenace,
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  
 17
Author: Aditi,
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.

 5
Author: nick,
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

 0
Author: sam,
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 ()

 0
Author: Sagar Byali,
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