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:
N
primeras posiciones.
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.
RANK
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).
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.
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.
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.
Para más información sobre RANK
, consulta la documentación oficial de Microsoft.
Jorge García
Fullstack developer