Problema: Instructores con más presencia en el Top 5

Instructores

Este problema lo encontré en un foro y me pareció ideal para practicar análisis de datos con SQL. La situación plantea una plataforma de aprendizaje que ofrece cursos impartidos por varios instructores. Cada curso tiene asociada una tabla de rankings que registra el desempeño dado por los asistentes al taller.

El objetivo es identificar qué instructores tienen la mayor cantidad de apariciones dentro del Top 5 del ranking.


Tablas disponibles para el problema del ranking de instructores

instructors

  • instructor_id
  • instructor_name

courses

  • course_id
  • instructor_id
  • course_title

course_rankings

  • course_id
  • therank

Comentario

En muchos casos, la primera reacción para resolver este problema es usar consultas anidadas. Aunque esa estrategia funciona, se vuelve difícil de leer y mantener. Una forma mucho más clara y estructurada de abordar este tipo de análisis es dividir la lógica en pasos usando CTEs (Common Table Expressions).

Las CTEs permiten expresar la solución de manera progresiva, casi como si narráramos la respuesta un paso a la vez. Entendido esto, planteemos una solución.


Pensando en SQL

  1. Contar cuántas veces aparecen en el Top 5 los cursos de cada instructor (therank <= 5).
  2. Obtener a los tres mejores instructores según ese conteo.
  3. Si hay empates, los instructores deben compartir el mismo rango.
  4. Los rangos deben ser continuos (por ejemplo: 1, 2, 2, 3).
  5. Considerar que un curso puede aparecer múltiples veces en course_rankings (diferentes semanas o periodos).

Solución paso a paso para el ranking de instructores

Paso 1 — Identificar las apariciones Top 5

Unimos las tres tablas porque cada una aporta la información que necesitamos: instructors nos dice quién es el instructor, courses conecta a cada instructor con sus cursos, y course_rankings contiene el desempeño de esos cursos en el ranking. Si solo miráramos course_rankings, sabríamos qué curso estuvo en qué posición, pero ignoraríamos quién lo impartió; y si miráramos solo instructors o courses, no tendríamos ninguna métrica de desempeño.

Al hacer los JOIN entre las tres y luego filtrar con therank <= 5, nos quedamos con las apariciones “exitosas” (Top 5) de cada curso, que son las que nos interesan para medir qué instructor acumula más cursos bien posicionados.

Paso 2 — Contar apariciones por instructor

Una vez que tenemos los registros donde un curso aparece dentro del Top 5, el siguiente paso es determinar cuántas veces ocurre esto para cada instructor. Agruparemos los resultados por instructor_id, que es la clave que identifica a cada instructor.

Este agrupamiento es fundamental porque un instructor está relacionado con varios cursos, y cada curso puede aparecer múltiples veces en el ranking. Al usar GROUP BY instructor_id y aplicar un COUNT(1), consolidamos todas esas apariciones en un solo número que representa la cantidad total de veces que los cursos de ese instructor han logrado posicionarse dentro del Top 5. También puede usarse COUNT(1). La idea es no sobrecargar a la base de datos con conteo de columnas innecesarias la instrucción COUNT(*).

Volviendo al tema, diremos que este agrupamiento transforma un conjunto de filas dispersas —cada una representando una aparición individual— en una métrica clara y comparable entre instructores. Es la base sobre la cual podremos aplicar el ranking en el siguiente paso.

Paso 3 — Asignar ranking con DENSE_RANK

Una vez que conocemos cuántas apariciones en el Top 5 tiene cada instructor, necesitamos ordenarlos de mayor a menor y asignarles un rango. Para esto utilizamos una función de ventana. En este caso, la opción adecuada es DENSE_RANK().

Usaremos esta instrucción ya que cuando dos instructores tienen igual número de apariciones, deben compartir el mismo rango. Si dos personas empatan en el primer lugar, ambos ocupan el rango 1, etc. Aquí es donde aparece la diferencia clave entre RANK() y DENSE_RANK():

  • RANK() asigna el mismo rango a los empates, pero salta el siguiente número. Ejemplo: 1, 2, 2, 4.
  • DENSE_RANK() también asigna el mismo rango a los empates, pero no deja huecos. Ejemplo: 1, 2, 2, 3.

Para este problema, necesitamos que los rangos sean continuos, sin saltos, porque queremos identificar a los Top 3 instructores de forma consistente. Si usáramos RANK(), un empate podría desplazar el tercer lugar y dejarlo fuera. Con DENSE_RANK(), en cambio, garantizamos que los rangos reflejen correctamente la posición relativa de cada instructor sin crear espacios innecesarios.

Paso 4 — Filtrar solo los Top 3 instructoresy armar la consulta final para el ranking de instructores

Después de asignar los rangos con DENSE_RANK(), ya contamos con una columna que indica la posición de cada instructor según la cantidad de apariciones en el Top 5. El último paso consiste en quedarnos con los instructores cuyo rango sea 1, 2 o 3.

Este filtro es importante ya que evita que ordenemos manualmente o limitar filas sin criterio. En lugar de eso, usamos el rango calculado, que ya incorpora empates y mantiene la continuidad numérica. De esta forma, si dos instructores comparten el primer lugar, ambos aparecen como rango 1, y el siguiente instructor será rango 2, no 3.

Al filtrar por instructor_rank <= 3, obtenemos los tres niveles superiores, sin importar cuántos instructores haya empatados en cada posición. Esto hace que el resultado sea consistente, justo y fácil de interpretar.

Expondré la respuesta a este problema en la próxima publicación.

Imagen de Gerd Altmann (Pixabay)


1 thought on “Problema: Instructores con más presencia en el Top 5”

  1. Pingback: Respuesta: Instructores con mayor presencia en el Top 5 - sqlenvivo.com

Comments are closed.

error: Content is protected !!