limitar-resultados-top-offset-sql

Limitar resultados TOP y OFFSET-FETCH

  • 4 min

Las clausulas TOP y OFFSET-FETCH, permiten limitar el numero de filas devueltas por una consulta.

A menudo, cuando hacemos una consulta, no queremos obtener todos los registros que cumplen una condición.

Imagina que quieres saber “¿Quiénes son los 3 empleados que más han vendido este mes?” o estás programando una página web y necesitas mostrar los resultados de la “Página 2” (del registro 11 al 20).

Para estos escenarios, T-SQL nos ofrece dos herramientas, TOP y la moderna y estándar OFFSET-FETCH.

¿Cuál uso?

CaracterísticaTOPOFFSET-FETCH
Uso Principal”Los N mejores”, muestreo rápido, subconsultas.Paginación de aplicaciones web.
Estándar SQLNo (Propietario de Microsoft).(ANSI SQL).
Requiere ORDER BYNo (pero recomendable).Sí (Obligatorio).
Soporta EmpatesSí (WITH TIES).No.
Soporta PorcentajeSí (PERCENT).No.
  • Usa TOP cuando quieras analizar extremos (precios más altos, últimas fechas) o necesites gestionar empates.
  • Usa OFFSET-FETCH cuando estés construyendo una API o una web que necesite botones de “Siguiente página”.

La cláusula TOP

TOP es la forma tradicional de SQL Server para limitar resultados. Es muy sencilla: le dices cuántas filas quieres y él se detiene en cuanto llega a ese número.

TOP con un número fijo

Es el uso más habitual. “Dame los 5 primeros”.

SELECT TOP (5) Nombre, Precio
FROM Productos
ORDER BY Precio DESC;
Copied!

Importante: TOP y ORDER BY deben ir siempre de la mano. Si usas TOP sin un ORDER BY, SQL Server te devolverá 5 filas “aleatorias” (basadas en cómo están físicamente en el disco o en caché), lo cual hace que tu consulta sea no determinista.

TOP con porcentaje (PERCENT)

En lugar de un número fijo, podemos pedir una proporción de los datos.

-- Obtener el 10% de los empleados con peores ventas
SELECT TOP (10) PERCENT Nombre, Ventas
FROM Empleados
ORDER BY Ventas ASC;
Copied!

Si la tabla tiene 100 filas, devolverá 10. Si tiene 105, devolverá 11 (siempre redondea hacia arriba para cumplir el porcentaje).

Paginación con OFFSET-FETCH

TOP es genial, pero tiene un problema: solo sabe coger datos desde el principio. No tiene una forma nativa fácil de decir “áltate los primeros 10 y dame los siguientes 10”.

Históricamente, hacer paginación en SQL Server era un dolor de cabeza (usando funciones como ROW_NUMBER). Afortunadamente, desde SQL Server 2012 tenemos OFFSET-FETCH.

Esta sintaxis es parte del estándar ANSI SQL (lo que significa que es similar en Oracle o PostgreSQL) y está diseñada específicamente para paginar resultados.

Sintaxis

Funciona como una extensión de la cláusula ORDER BY.

SELECT Columnas
FROM Tabla
ORDER BY Columna
OFFSET X ROWS          -- Cuántas filas me salto
FETCH NEXT Y ROWS ONLY -- Cuántas filas cojo
Copied!
  1. Estándar: Es código portable.
  2. Claridad: El propósito del código es obvio (paginar).
  3. Flexible: Puedes usar solo OFFSET sin FETCH (para decir “dame todos menos los 5 primeros”), aunque es raro usarlo así.