Funciones de ventana de SQL Server RANK, DENSE_RANK y NTILE


By: Koen Verbeeck
Overview

El tema de esta parte es acerca de las funciones de clasificación. Se introdujeron en SQLServer 2005. ROW_NUMBER también es una función de clasificación, pero ya se ha cubierto extensivamente en la parte anterior de este tutorial.

RANK and DENSE_RANK

en contraste con la función ROW_NUMBER,RANK andDENSE_RANK no tienen que generar números únicos. La diferencia entre todas estas funciones es cómo manejan los lazos.,

  • ROW_NUMBER siempre generará valores únicos sin espacios, incluso si hay lazos.
  • RANK puede tener huecos en su secuencia y cuando los valores son los mismos, obtienen el mismo rango.
  • DENSE_RANK también devuelve el mismo rango para los lazos, pero no tiene anygaps en la secuencia.

Vamos a ilustrar con un ejemplo., Supongamos que tenemos los siguientes samplevalues:

podemos escribir la siguiente consulta para probar las tres funciones de clasificación:

esto nos da este conjunto de resultados:

como puede ver, RANK devolverá rango por corbatas. Sin embargo, el siguiente grupo rankin A es el número 3, omitiendo el rango 2. DENSE_RANK por otro lado no esquiva el rango 2. Cuando no hay empates en el conjunto de récords, las tres funciones de ranking devuelven exactamente el mismo resultado.,

con ROW_NUMBER y RANK, podemos crear una construcción alternativa para detectar duplicaterows. Con los mismos datos de muestra utilizados en la parte 5 de este tutorial, podemos crear la siguiente consulta para encontrar todas las filas que tienen una clave de negocio duplicada:

el conjunto de resultados:

ahora solo necesitamos filtrar en los registros donde el número de fila generado (RID) es diferente del rango (RankID). Esto devolverá un registro para Bob, así que sabemos que hay un registro duplicado para ese empleado.

¿cuándo usar RANK o DENSE_RANK?,

como se especificó anteriormente, RANK puede tener huecos en la secuencia y DENSE_RANK no. supongamos que tiene la tarea de encontrar los 5 mejores clientes de acuerdo con el valor de ventas.Con RANK, puede clasificar a sus clientes y luego filtrar a cualquier cliente con arank mayor de 5. Si usted haría lo mismo con DENSE_RANK, usted podría terminar con más de 6 clientes!,

Supongamos que tenemos este conjunto de datos sobre nuestros clientes:

Cuando la adición de filas con RANGO y DENSE_RANK, tenemos el siguiente conjunto de datos:

Cuando el filtrado en el rango de <= 5, obtendrá exactamente 5 filas devueltas. Sin embargo, si filtra en denserank <= 5, obtendrá 6 filas, que podrían no ser lo que desea. Cuantos más lazos, más filas puede devolver DENSE_RANK. Si el empate estaría exactamente en la fila número 5, la función RANK también devolvería 6 filas., En ese caso, necesitas «romper el empate». Puede hacer esto usando la función ROW_NUMBERfunction o ordenando en columna adicional.

NTILE

La última función de clasificación es un poco especial. NTILE divide las filas en cubos de tamaño rugosequal. Supongamos que tiene 20 filas y especifica NTILE (2). Esto le dará 2 cubos con 10 filas cada uno. Al usar NTILE (3), obtienes 2 cubos con 7 filas y 1 cubo con 6 filas.,

reutilicemos la consulta de la sección anterior, pero agreguemos una expresión usando NTILE:

obtenemos los siguientes resultados:

Un ejemplo en el que NTILE se usó para dividir datos en cubos se describe en eltiphow para crear un gráfico de mapa de calor en SQL Server Reporting Services 2016.,

información adicional
  • Más consejos sobre las funciones de clasificación:
    • Funciones de clasificación de SQL Server 2005 y 2008 DENSE_RANK y NTILE
    • Funciones de clasificación de SQL Server 2005 y 2008 ROW_NUMBER y Rank
    • Funciones de SQL Server olvidadas – VARP, SOUNDEX y NTILE

última actualización: 31/5/2018

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *