0Pricing
Coding Interview Prep · Lección

ROW_NUMBER para secuencias únicas

Asigne un número de fila determinista dentro de cada partición

ROW_NUMBER para secuencias únicas es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.

Qué garantiza ROW_NUMBER

ROW_NUMBER() asigna un entero único y consecutivo a cada fila dentro de su partición, empezando en 1 y siguiendo el ORDER BY de la ventana. Nunca dos filas comparten un número, aunque sus valores de ordenación sean idénticos.

Esta unicidad es precisamente la razón por la que los entrevistadores recurren a ella para resolver problemas de «elegir una fila por grupo» y de eliminación de duplicados. Las otras funciones de ranking (RANK, DENSE_RANK) no garantizan la unicidad cuando hay empates.

Consulta mínima con ROW_NUMBER

La forma más sencilla numera todo un conjunto de resultados en el orden elegido. ROW_NUMBER siempre necesita un ORDER BY dentro de OVER: sin él, la numeración sería arbitraria y la mayoría de los motores la rechazan o emiten una advertencia.

En este caso, el empleado contratado más recientemente ocupa la fila 1 si ordena por fecha de contratación descendente.

SELECT
  name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date DESC) AS rn
FROM employees;

Numerar dentro de particiones

Añada PARTITION BY para numerar las filas de forma independiente dentro de cada grupo. El contador vuelve a comenzar en 1 para cada nuevo valor de partición.

En el ejemplo, cada departamento obtiene su propia secuencia 1, 2, 3, ordenada por salario. La persona con mayores ingresos de cada departamento ocupa el número 1: es la base del patrón top-N-per-group.

SELECT
  department,
  name,
  salary,
  ROW_NUMBER() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ) AS dept_rn
FROM employees;

ROW_NUMBER y los empates: no hay empates

Punto clave en las entrevistas: cuando dos filas tienen valores de ordenación iguales, ROW_NUMBER aun así les asigna números diferentes. Cuál de ellas obtiene el número menor es no determinista a menos que añada una columna para desempatar.

  • RANK asignaría el mismo ranking a las filas empatadas.
  • ROW_NUMBER elige arbitrariamente un orden entre ellas.

Para que los resultados sean reproducibles, añada siempre un criterio de desempate único a ORDER BY.

SELECT
  name,
  salary,
  ROW_NUMBER() OVER (
    ORDER BY salary DESC, employee_id  -- employee_id breaks ties deterministically
  ) AS rn
FROM employees;

La regla del desempate determinista

Si su ORDER BY no establece un orden estricto (ninguna combinación de columnas es única), la numeración de las filas puede cambiar entre ejecuciones, incluso con los mismos datos. Los entrevistadores suelen incluir esta trampa en preguntas sobre paginación y «el registro más reciente».

Regla práctica: añada una clave primaria u otra columna única como último criterio de ordenación siempre que el resultado deba ser estable.

-- Unstable: many rows can share the same created_at
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC)

-- Stable: id guarantees a single deterministic winner
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC, id DESC)

Ejemplo resuelto: el pedido más reciente de cada cliente

Una pregunta clásica: «Devuelva el pedido más reciente de cada cliente». Numere los pedidos de cada cliente por fecha descendente y, después, conserve rn = 1 en una consulta externa.

Como ROW_NUMBER garantiza exactamente una fila con el número 1 por partición, obtiene exactamente una fila por cliente, sin duplicados aunque dos pedidos compartan la misma marca de tiempo (el desempate lo resuelve).

SELECT customer_id, order_id, order_date, amount
FROM (
  SELECT
    customer_id, order_id, order_date, amount,
    ROW_NUMBER() OVER (
      PARTITION BY customer_id
      ORDER BY order_date DESC, order_id DESC
    ) AS rn
  FROM orders
) t
WHERE rn = 1;

Ejemplo resuelto: eliminar filas duplicadas

ROW_NUMBER es la herramienta más sencilla para eliminar duplicados. Particione por las columnas que definen un duplicado, ordene según una regla de preferencia y, después, conserve rn = 1.

Aquí consideramos duplicadas las filas que tienen el mismo correo electrónico y conservamos la creada primero. Todo lo que tenga rn > 1 es un duplicado que puede eliminar o ignorar.

SELECT id, email, created_at
FROM (
  SELECT
    id, email, created_at,
    ROW_NUMBER() OVER (
      PARTITION BY email
      ORDER BY created_at ASC, id ASC
    ) AS rn
  FROM users
) t
WHERE rn = 1;

ROW_NUMBER para la paginación

Antes de que OFFSET/FETCH se generalizaran, ROW_NUMBER impulsaba la paginación, y todavía lo hace en SQL Server y en muchos trabajos de ETL. Numere las filas en un orden estable y, después, filtre un intervalo de números en una consulta externa.

Advertencia para entrevistas: la paginación solo es correcta si el orden es determinista; de lo contrario, la misma fila puede aparecer en dos páginas o no aparecer en ninguna.

SELECT *
FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY created_at, id) AS rn
  FROM articles
) t
WHERE rn BETWEEN 21 AND 40;  -- page 2, 20 per page

Asignar una secuencia para reordenar datos

A veces solo necesita un índice secuencial, por ejemplo, para volver a numerar las filas después de ordenarlas, crear una etiqueta del 1 al N o emparejar filas con una serie generada. ROW_NUMBER aplicado al orden deseado produce una secuencia densa y limpia, sin saltos.

Esta también es la forma de asignar una posición estable a un conjunto arbitrario sin ordenar para poder combinarlo más adelante.

SELECT
  ROW_NUMBER() OVER (ORDER BY score DESC, player_id) AS leaderboard_position,
  player_id,
  score
FROM scores;

ROW_NUMBER frente a COUNT para la «fila N»

Cuando le pidan «el tercer pedido más reciente» o «la segunda fila», recurra a ROW_NUMBER y filtre por el valor exacto en una consulta externa. Como la numeración es única, rn = 3 devuelve exactamente una fila.

Compárelo con RANK: si quiere el segundo valor distinto (por ejemplo, el segundo salario más alto incluyendo empates), ROW_NUMBER no es la herramienta adecuada; necesita DENSE_RANK, que se explica en la siguiente lección.

SELECT order_id, order_date
FROM (
  SELECT order_id, order_date,
         ROW_NUMBER() OVER (ORDER BY order_date DESC, order_id DESC) AS rn
  FROM orders
) t
WHERE rn = 3;  -- exactly the 3rd most recent order

Repaso de los errores frecuentes

Tenga claros estos puntos durante una entrevista:

  • ROW_NUMBER siempre es único y consecutivo dentro de una partición.
  • Necesita un ORDER BY en OVER; sin un desempate único, los resultados no son deterministas cuando hay empates.
  • No puede filtrarse en WHERE: debe envolverlo en una subconsulta o CTE.
  • Úselo para obtener una fila por grupo, eliminar duplicados y paginar; use DENSE_RANK cuando los empates deban compartir un número.

Comprobación rápida

¿Cómo gestiona ROW_NUMBER las filas empatadas en el valor de ORDER BY?

Repaso: secuenciación determinista

ROW_NUMBER es su herramienta para obtener una numeración única y consecutiva dentro de las particiones. Ha aprendido a:

  • Numerar conjuntos completos y grupos por partición.
  • Añadir un desempate único para obtener resultados deterministas y reproducibles.
  • Resolver problemas de la última fila por clave, eliminación de duplicados, paginación y fila N filtrando rn en una consulta externa.

A continuación, verá cómo RANK y DENSE_RANK asignan deliberadamente el mismo número a los empates y en qué se diferencia su comportamiento respecto a los saltos.

Preguntas frecuentes

¿La lección «ROW_NUMBER para secuencias únicas» es gratis?

Sí — el texto completo de «ROW_NUMBER para secuencias únicas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «ROW_NUMBER para secuencias únicas»?

Asigne un número de fila determinista dentro de cada partición Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Coding Interview Prep?

No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «ROW_NUMBER para secuencias únicas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?

Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. OVER, PARTITION BY y ORDER BY
  2. ROW_NUMBER para secuencias únicas
  3. RANK frente a DENSE_RANK con empates
  4. Filtrar por un resultado de ventana
← Volver a Coding Interview Prep