sintaxis over ntile dense_rank consecutive sql sql-server sql-server-2008 tsql

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.