Volver a la lista de artículos Artículos
Lectura de 7 minutos

¿Qué es la función RANK() en SQL y cómo se utiliza?

¿Quiénes son sus 10 clientes más importantes? ¿Quiénes son los empleados con mayor rendimiento en cada departamento? Para responder a estas preguntas, necesitará clasificar la salida de su consulta SQL. Veamos cómo la función RANK() ayuda a clasificar los resultados en SQL.

Hay muchos casos de uso en los que puede necesitar clasificar filas en SQL. Puede querer clasificar a los clientes en función del volumen de ventas, a los estudiantes en función de los resultados de sus exámenes, a los activos de la empresa en función de su valor actual, a los departamentos en función del número de empleados o a los usuarios en función de su fecha de registro.

La clasificación es una herramienta importante y común en el análisis de datos. En este tutorial, proporcionaré explicaciones detalladas sobre cómo clasificar filas en SQL.

Introducción a la función RANK()

La función RANK() es una de las funciones de ventana en SQL. Las funciones de ventana miran una parte de los datos y calculan los resultados de esta parte.

La función RANK(), específicamente, asigna un rango a cada fila basado en una columna proporcionada. RANK() se incluye en la sentencia SELECT con la siguiente sintaxis:

RANK() OVER (ORDER BY column ASC|DESC)

Básicamente, se añade otra columna al conjunto de resultados. Esta columna incluye el rango de cada registro basado en el orden especificado después de la palabra clave ORDER BY. Esto implica especificar (1) la columna a utilizar para ordenar las filas y (2) si el orden debe ser ascendente o descendente.

La primera fila obtiene el rango 1, y las siguientes filas obtienen rangos más altos. Si alguna fila tiene el mismo valor en la columna utilizada para la ordenación, se clasifica igual. La función RANK() deja huecos en estos casos.

Por ejemplo, si la primera y la segunda fila tienen el mismo valor en la columna proporcionada, ambas obtienen el rango 1. Entonces, la tercera fila obtiene el rango 3 (es decir, falta el rango 2).

Para adquirir confianza con la función RANK(), consulte nuestro curso interactivo Funciones de ventana interactivo. También cubre otras funciones de clasificación que tienen diferentes enfoques para procesar los mismos valores en la columna proporcionada.

Ahora, veamos la función RANK() en acción.

Clasificación básica

Para ver cómo funciona la función RANK() en la práctica, vamos a ver un ejemplo. Imaginemos que tenemos un equipo de desarrolladores. Queremos clasificarlos en función de su experiencia. Esta es la tabla con la que empezamos:

developers
idfirst_namelast_namelevelyears_experience
10JackDavisjunior1
11HelenBrownjunior0
12KateWilliamssenior4
13AlexMillersenior8
14SophiaMooremid-level3
15NickJacksonmid-level3
16StevenMartinjunior2
17MeganStevensjunior1
18JohnJonessenior5
19MaxWebermid-level4

Ahora, nuestra tarea es mostrar el nombre, el apellido, el nivel de antigüedad, los años de experiencia y el rango de los desarrolladores. Queremos que el desarrollador con más experiencia obtenga el rango 1.

Aquí está nuestra consulta SQL junto con el conjunto de resultados:

SELECT first_name, last_name, level, years_experience,
       RANK() OVER (ORDER BY years_experience DESC)
FROM developers;
first_namelast_namelevelyears_experiencerank
AlexMillersenior81
JohnJonessenior52
MaxWebermid-level43
KateWilliamssenior43
NickJacksonmid-level35
SophiaMooremid-level35
StevenMartinjunior27
MeganStevensjunior18
JackDavisjunior18
HelenBrownjunior010

Para clasificar a los desarrolladores en función de su experiencia, hemos incluido el siguiente campo en la sentencia SELECT:

RANK() OVER (ORDER BY years_experience DESC)

Definimos el orden después de la cláusula ORDER BY especificando la columna a utilizar para la clasificación (years_experience) y el orden (descendente). A continuación, clasificamos los desarrolladores en función de este orden.

Vemos que el desarrollador con 8 años de experiencia obtiene el rango 1, el desarrollador con 5 años de experiencia obtiene el rango 2, y los dos desarrolladores con 4 años de experiencia obtienen el rango 3. Tenga en cuenta que la función RANK() deja un hueco aquí, y los siguientes desarrolladores obtienen el rango 5 (es decir, falta el rango 4).

Ahora tienes una idea de cómo funciona la función RANK(), incluyendo cómo procesa los mismos valores en la columna utilizada para la ordenación. Puedes encontrar más casos de uso en esta guía completa de clasificación de filas en SQL.

Ahora, pasaremos a ejemplos más avanzados.

Clasificación dentro de diferentes grupos

En nuestro primer ejemplo, hemos clasificado todo el conjunto de resultados. Ahora, digamos que queremos tener una clasificación separada para cada uno de los niveles de antigüedad (es decir, junior, nivel medio y senior).

Con la función RANK() de SQL, podemos hacerlo añadiendo la palabra clave PARTITION BY y especificando la columna que se utilizará para agrupar los registros. Esta es nuestra consulta SQL:

SELECT first_name, last_name, level, years_experience,
       RANK() OVER (PARTITION BY level ORDER BY years_experience    DESC)
FROM developers;

En la cláusula OVER(), primero definimos cómo agrupar los registros (utilizando la columna level ) y luego definimos cómo ordenar los registros dentro de estos grupos (basándonos en los años de experiencia, empezando por el desarrollador más experimentado).

Esta es la tabla resultante:

first_namelast_namelevelyears_experiencerank
StevenMartinjunior21
JackDavisjunior12
MeganStevensjunior12
HelenBrownjunior04
MaxWebermid-level41
NickJacksonmid-level32
SophiaMooremid-level32
AlexMillersenior81
JohnJonessenior52
KateWilliamssenior43

Observa que tenemos clasificaciones separadas para los niveles junior, medio y senior. Aun así, el desarrollador más experimentado de cada grupo obtiene el puesto 1, y los desarrolladores con menos experiencia obtienen puestos más altos.

Además, observa que aunque Kate Williams y Max Weber tienen los mismos 4 años de experiencia, Max obtiene el puesto 1 como desarrollador de nivel medio con más experiencia, mientras que Kate obtiene el puesto 3 como desarrolladora senior con menos experiencia.

Ahora que sabe cómo funciona PARTITION BY, es hora de conocer otras funciones de clasificación.

Otras funciones de clasificación en SQL

Para clasificar filas en SQL, también puede utilizar las funciones DENSE_RANK() y ROW_NUMBER(). La diferencia radica en la forma en que estas funciones manejan los mismos valores.

Como aprendimos anteriormente, la función RANK() da el mismo rango a los registros con el mismo valor y deja un espacio para dar cuenta de estos registros. En cambio

  • la función DENSE_RANK() no deja un hueco;
  • la función ROW_NUMBER() clasifica todos los registros de forma diferente, aunque los valores sean los mismos.

Es más fácil entender esta diferencia con un ejemplo. Así pues, volvamos a nuestro primer caso de uso en el que clasificamos todo el conjunto de resultados. Pero, esta vez, también utilizaremos DENSE_RANK() y ROW_NUMBER():

SELECT first_name, last_name, level, years_experience,
       RANK() OVER (ORDER BY years_experience DESC),
       DENSE_RANK() OVER (ORDER BY years_experience DESC),
       ROW_NUMBER() OVER (ORDER BY years_experience DESC)
FROM developers;
first_namelast_namelevelyears_experiencerankdense_rankrow_number
AlexMillersenior8111
JohnJonessenior5222
MaxWebermid-level4333
KateWilliamssenior4334
NickJacksonmid-level3545
SophiaMooremid-level3546
StevenMartinjunior2757
MeganStevensjunior1868
JackDavisjunior1869
HelenBrownjunior010710

Al igual que la función RANK(), la función DENSE_RANK() da el mismo rango a los desarrolladores con los mismos años de experiencia (por ejemplo, el rango 3 a Kate Williams y Max Weber). Sin embargo, el siguiente rango en la columna dense_rank es el 4, lo que no deja ningún hueco en la clasificación.

Por otro lado, la función ROW_NUMBER() asigna un número diferente a todos los desarrolladores, incluidos los que tienen los mismos años de experiencia. Entonces, ¿por qué Max obtiene el rango 3 y Kate el 4? Es una elección arbitraria, y nunca se sabe a cuál de los registros con el mismo valor se le asignará un rango superior.

Ahora que conoce la diferencia entre las funciones de clasificación, puede decidir cuál es la más adecuada para sus casos de uso. Si no está seguro, vea más ejemplos de las funciones RANK(), DENSE_RANK(), y ROW_NUMBER() en este artículo general.

Es hora de practicar las funciones de clasificación

Las funciones de clasificación se encuentran entre las herramientas más comunes utilizadas por los analistas de datos. Por lo tanto, debería sentirse seguro con la clasificación en SQL. Y la confianza viene con la práctica.

Consulte este Funciones de ventana curso que incluye 218 ejercicios interactivos que cubren funciones de clasificación, funciones de análisis, cálculo de estadísticas avanzadas con diferentes marcos de ventana, etc. Puede obtener más información sobre el curso en este artículo.

Y aquí hay un extra: esta hoja de trucos de 2 páginas de SQL Funciones de ventana le ayudará a practicar las funciones de clasificación y otras funciones de ventana.

Gracias por leer, y ¡feliz aprendizaje!