Devolver de forma fiable las filas superiores
Descubra por qué ORDER BY más LIMIT puede ser no determinista sin un criterio de desempate
Devolver de forma fiable las filas superiores es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 3 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.
El error oculto en las consultas Top-N
«Deme los 5 empleados con los salarios más altos» parece sencillo: ORDER BY salary DESC LIMIT 5. Pero los entrevistadores suelen incluir una trampa. ¿Qué ocurre si seis personas comparten el mismo salario en el límite? ¿Y si empatan muchas filas?
El problema central es el determinismo: cuando la clave de ordenación contiene empates, LIMIT corta de forma arbitraria y las filas exactas devueltas pueden cambiar entre ejecuciones. Esta lección le enseña a hacer fiables las consultas Top-N.
Por qué ORDER BY + LIMIT puede no ser determinista
Considere unos salarios en los que los puestos 4, 5 y 6 son todos 50000. ORDER BY salary DESC LIMIT 5 debe devolver exactamente 5 filas, así que conserva dos de las tres filas empatadas y descarta una, pero no está definido cuáles dos.
Si ejecuta la consulta dos veces, o después de que el optimizador cambie los planes, puede obtener personas diferentes. Ese no determinismo es el error que los entrevistadores quieren que detecte.
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;Solución 1: añadir un criterio de desempate único
La solución más sencilla es hacer que el orden de clasificación sea total añadiendo una columna única, normalmente la clave primaria. Así, no hay dos filas iguales respecto a la clave completa, por lo que el corte es determinista y reproducible.
Esto no cambia qué salarios aparecen, pero hace estable entre ejecuciones la elección entre las filas empatadas.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 5;Solución 2: incluir todos los empates con WITH TIES
A veces el requisito es «incluir a todas las personas empatadas con el límite», no devolver exactamente N filas. SQL estándar y SQL Server ofrecen WITH TIES, que devuelve las filas adicionales que coinciden con el valor de ORDER BY de la última fila.
Si el quinto salario lo comparten tres personas, esto devuelve 7 filas. Tenga en cuenta que WITH TIES requiere un ORDER BY.
SELECT name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;Aclare primero el requisito
Antes de programar, pregunte al entrevistador: «Si hay empates en el límite, ¿quiere exactamente N filas o todas las filas empatadas?» Esta única pregunta aclaratoria demuestra experiencia.
- Exactamente N, de forma estable: añada un criterio de desempate único.
- Incluir todos los empates: use
WITH TIESoRANK. - Valores distintos: use
DENSE_RANK.
El enfoque portable con funciones de ventana
Muchos motores no admiten WITH TIES. El patrón potente y portable utiliza una función de ventana de clasificación en una subconsulta o CTE y después filtra por la clasificación. ROW_NUMBER devuelve exactamente N filas con una clave de ordenación determinista.
Debe envolver la función de ventana porque no puede referenciarla directamente en WHERE.
SELECT name, salary
FROM (
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 5;Usar RANK para conservar los empates
Sustituya ROW_NUMBER por RANK cuando quiera conservar todas las filas empatadas y dejar huecos en la numeración. Si tres filas empatan en el puesto 4, todas reciben el puesto 4 y el siguiente puesto es el 7.
Filtrar con rank <= 5 devuelve entonces todas las filas de las cinco primeras posiciones salariales, incluidos los empates.
SELECT name, salary
FROM (
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk <= 5;DENSE_RANK para los N valores distintos más altos
«Los 3 niveles salariales más altos» (no las 3 personas con los salarios más altos) significa valores distintos. DENSE_RANK asigna la misma clasificación a los empates y no omite números, por lo que dense_rnk <= 3 devuelve a todas las personas que cobran uno de los tres salarios distintos más altos.
Saber qué función de clasificación responde a cada formulación es un diferenciador clásico.
SELECT name, salary
FROM (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees
) ranked
WHERE drnk <= 3;Caso especial del primer puesto
Para una sola fila superior, ORDER BY ... LIMIT 1 funciona, pero sigue teniendo riesgo de empates. Si quiere obtener todas las filas que tienen el valor máximo, compárelo con el máximo de una subconsulta o use RANK() = 1.
La forma basada en una subconsulta con el máximo es clara y funciona en cualquier dialecto.
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);Comparación de los enfoques
Resumen de cuándo utilizar cada herramienta para obtener resultados Top-N fiables:
LIMIT+ criterio de desempate único: exactamente N filas, estable y sencillo.FETCH ... WITH TIES: exactamente N filas más los empates del límite, según SQL estándar.ROW_NUMBER: exactamente N filas, determinista y totalmente portable.RANK: las N primeras posiciones, incluidos todos los empates.DENSE_RANK: los N valores distintos más altos.
Avance: Top-N por grupo
El enfoque con ventanas se generaliza de forma excelente. Añada PARTITION BY para obtener los N primeros elementos dentro de cada grupo, por ejemplo las 2 personas con mayores ingresos de cada departamento. Se aplica el mismo filtro rn <= n después de particionar.
Este Top-N por grupo es uno de los problemas de entrevista reales más frecuentes y se basa exactamente en el patrón que acaba de aprender.
SELECT department, name, salary
FROM (
SELECT department, name, salary,
ROW_NUMBER() OVER (PARTITION BY department
ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 2;Comprobación rápida
Relacione cada requisito con la función adecuada.
Repaso
Para devolver resultados Top-N fiables:
ORDER BY ... LIMITpor sí solo no es determinista cuando la clave de ordenación contiene empates.- Añada un criterio de desempate único para obtener de forma estable exactamente N resultados.
- Use
WITH TIESoRANKpara conservar los empates del límite. - Use
DENSE_RANKpara obtener los N valores distintos más altos. - Aclare siempre si el entrevistador quiere exactamente N filas o todos los empates.
Preguntas frecuentes
¿La lección «Devolver de forma fiable las filas superiores» es gratis?
Sí — el texto completo de «Devolver de forma fiable las filas superiores» 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 «Devolver de forma fiable las filas superiores»?
Descubra por qué ORDER BY más LIMIT puede ser no determinista sin un criterio de desempate 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 3 de 4.
¿Cuánto tiempo toma la lección «Devolver de forma fiable las filas superiores»?
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
- Ordenación por varias columnas y posición de NULL
- LIMIT, OFFSET y FETCH FIRST
- Devolver de forma fiable las filas superiores
- Ordenar por expresiones y alias