Volver a la página principal
viernes 27 septiembre 2024
17

Cómo obtener el rango de filas con RANK en SQL Server

¿Qué es RANK y para qué se usa?

RANK es una función de ventana que se utiliza para calcular la posición de cada fila dentro de una partición o grupo, según un orden establecido. Asigna un número consecutivo a cada fila, y las filas con valores iguales en la columna de orden reciben el mismo rango. Sin embargo, al encontrar valores duplicados, RANK deja un hueco en la numeración para la siguiente posición. Esto significa que, si dos filas comparten el mismo rango, la siguiente fila tendrá un valor de rango incrementado en función de cuántas filas compartan el rango anterior.

Se usa en escenarios como:

  • Clasificar puntuaciones o ventas.
  • Seleccionar las N primeras posiciones.
  • Identificar la posición de un valor dentro de una categoría.
  • Realizar análisis comparativos entre filas.

Sintaxis de RANK

RANK() OVER ( [PARTITION BY column1, column2, ...] ORDER BY column_name [ASC|DESC] )
  • PARTITION BY: (Opcional) Divide el conjunto de resultados en grupos. El rango se reinicia en cada partición.
  • ORDER BY: Especifica cómo se ordenan las filas para calcular el rango. La cláusula ORDER BY determina el criterio de clasificación.

Ejemplos de uso de RANK

Asignar rangos a filas sin partición

Supongamos que tienes una tabla Ventas con las columnas Empleado y Total_Ventas, y deseas clasificar a los empleados según el monto de ventas en orden descendente:

SELECT Empleado, Total_Ventas, 
       RANK() OVER (ORDER BY Total_Ventas DESC) AS Rango
FROM Ventas;

Resultado:

Empleado  | Total_Ventas | Rango
----------|--------------|------
Ana       | 1500         | 1
Juan      | 1300         | 2
Luis      | 1300         | 2
Pedro     | 900          | 4

Aquí, los empleados Juan y Luis tienen el mismo Rango (2) porque comparten el mismo valor en Total_Ventas, y el siguiente valor de rango es 4 (salta el número 3).

Usar RANK con partición por categoría

Si la tabla Ventas también tiene una columna Departamento y quieres calcular el rango de ventas dentro de cada departamento:

SELECT Departamento, Empleado, Total_Ventas, 
       RANK() OVER (PARTITION BY Departamento ORDER BY Total_Ventas DESC) AS Rango
FROM Ventas;

Resultado:

Departamento | Empleado  | Total_Ventas | Rango
-------------|-----------|--------------|------
Ventas       | Ana       | 1500         | 1
Ventas       | Luis      | 1300         | 2
Ventas       | Juan      | 1300         | 2
Soporte      | Pedro     | 900          | 1
Soporte      | Marta     | 700          | 2

El RANK se reinicia para cada Departamento, permitiendo calcular el ranking de ventas dentro de cada grupo.

Seleccionar las primeras N filas de cada grupo

Si deseas encontrar a los 2 mejores vendedores de cada departamento:

WITH Ranking AS (
    SELECT Departamento, Empleado, Total_Ventas, 
           RANK() OVER (PARTITION BY Departamento ORDER BY Total_Ventas DESC) AS Rango
    FROM Ventas
)
SELECT * FROM Ranking WHERE Rango <= 2;

Resultado:

Departamento | Empleado  | Total_Ventas | Rango
-------------|-----------|--------------|------
Ventas       | Ana       | 1500         | 1
Ventas       | Luis      | 1300         | 2
Ventas       | Juan      | 1300         | 2
Soporte      | Pedro     | 900          | 1
Soporte      | Marta     | 700          | 2

Esto devuelve a los dos empleados con las mayores ventas en cada departamento, incluyendo aquellos con rangos empatados.

Diferencias con otras funciones de ranking (DENSE_RANK y ROW_NUMBER)

  • DENSE_RANK: Similar a RANK, pero no deja huecos en el rango. Si dos filas tienen el mismo rango, la siguiente fila obtiene el rango consecutivo.
  • ROW_NUMBER: No permite empates. Asigna un número de fila único, independientemente de los valores en la columna de orden.

Referencia oficial

Para más información sobre RANK, consulta la documentación oficial de Microsoft.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer