SQL OFFSET: Limite el Número de filas

La cláusula SQL OFFSET se utiliza para especificar un número N de resultados de la consulta inicial que deben omitirse (no devolverse a la aplicación). N se calcula mediante una expresión que puede ser un único literal entero, o una única variable externa, o cualquier expresión que se cree a partir de literales y variables externas y devuelva un único entero no negativo.

Sintaxis usando la cláusula SQL OFFSET:

A continuación se muestra la sintaxis de la cláusula OFFSET:

La sintaxis de la clausula SQL OFFISET  sin FETCH.

SELECT columna...
FROM table-name
ORDER BY column-names
OFFSET n ROWS

Sintaxis usando SQL OFFSET y FETCH.

Esto devuelve solo registros (n + 1) a (n + m). Vea el ejemplo a continuación.

SELECT columnas..
FROM tabla
ORDER BY columna
OFFSET n ROWS
FETCH NEXT m ROWS ONLY

Nota:

  • La clausula SQL server OFFSET solo se puede usar con la cláusula ORDER BY. No se puede usar solo.
  • El valor de OFFSET debe ser mayor o igual a cero. No puede ser negativo, de lo contrario devolverá error.
  • SQL OFFSET excluye el primer conjunto de filas en un conjunto de resultados. OFFSET con FETCH NEXT devuelve una ventana definida de filas. OFFSET con FETCH NEXT es excelente para el soporte de paginación.
  • La cláusula SQL OFFSET es la cláusula obligatoria en la combinación y sigue a la cláusula ORDER BY.
  • La cláusula FETCH es opcional

Ejemplo de la cláusula SQL OFFSET sin  FETCH

Ahora aplicaremos el desplazamiento en la consulta para saltar 5 filas con la clausula SQL offiset.

SELECT id,Nombre,Sexo,Pais,cantidad
FROM Cliente
ORDER BY id 
OFFSET 5 ROWS 

sql offset

Ejemplo de la cláusula SQL OFFSET con FETCH

Podemos modificar la consulta anterior agregando la cláusula SQL FETCH como se muestra a continuación con un argumento 3 para indicar que solo se deben devolver las siguientes 3 filas después de las primeras 5 filas en el conjunto de resultados.

SELECT id,Nombre,Sexo,Pais,cantidad
FROM Cliente
ORDER BY id 
OFFSET 5 ROWS 
FETCH NEXT 3 ROWS ONLY

El resultado será el siguiente, que es casi el mismo que el anterior, omitiendo las últimas 5 filas y mostrando solo 3 filas después del desplazamiento en el conjunto de resultados.

sql offset

También es posible especificar el número de filas para SQL OFFSET y FETCH como un cálculo matemático como se muestra a continuación. 

SELECT id, Nombre, cantidad, Sexo, Pais 
FROM Cliente
ORDER  BY id
OFFSET 2 ROWS
FETCH NEXT  10-5 2  ROWS  ONLY ;

sql offiset

La consulta anterior generará el siguiente resultado. Omite las primeras 2 filas (10-5=5) y devuelve las siguientes 5 filas del conjunto de resultados ORDER BY original anterior.
Problema : enumere los productos más caros del 10 al 15 ordenados por precio.

SELECT Id, Productnombre, UnitPricio
  FROM Producto
 ORDER BY UnitPricio DESC
OFFSET 10 ROWS
 FETCH NEXT 5 ROWS ONLY

Imprime las 2 filas inferiores de la tabla Empleado cuando se ordena por Salario.

SELECT nombre, apellido, salario
FROM Empleado
ORDER BY Salario
OFFSET (SELECT COUNT(*) FROM EMPLEADO) - 2 ROWS
FETCH NEXT 2 ROWS;

Puntos importantes:

  1. La cláusula SQL OFFSET  NO es obligatoria con FETCH. Nunca puede usar, ORDENAR POR… FETCH.
  2. La Cláusula TOP no se puede combinar con OFFSET y FETCH.
  3. La expresión de recuento de filas OFFSET/FETCH solo puede ser cualquier expresión aritmética, constante o de parámetro que devuelva un valor entero.
  4. ORDER BY es obligatorio para ser utilizado con la cláusula OFFSET y FETCH.
  5. El valor de OFFSET debe ser mayor o igual a cero. No puede ser negativo, de lo contrario devolverá error
  6. Aunque es posible usar offset sin una cláusula order-by, no tiene mucho sentido hacerlo. Esto se debe a que sin orden por, los resultados se devuelven en un orden aleatorio, por lo que el subconjunto de resultados omitidos será diferente cada vez que se ejecute la consulta. 
  7. Las cláusulas OFFSET y FETCH son compatibles con ANSI y se agregaron a SQL Server 2012.

Deja un comentario