Filtrando datos con TOP y Offset-Fetch

Con la opción TOP se puede filtrar o limitar la cantidad de filas que serán retornadas en el set de datos del resultado. La clausula TOP se específica en la clausula SELECT seguido del valor numérico entre paréntesis (se puede sin paréntesis por compatibilidad).


Select Top (3) P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
order by p.FechaNacimiento

En este caso la cantidad de filas en el set de resultado será máximo de 3 filas.




También se puede especificar un valor porcentual de filas, para esto se debe especificar la clausula TOP seguido del valor numérico dentro de paréntesis y la palabra percent después de los paréntesis. El valor numérico debe ser escrito entre 0 y 100. En caso de que el resultado del porcentaje sea un valor decimal, este se redondea al nivel superior.

El total de filas para la tabla Personas es de 10, por este motivo el resultado es:

Select Top (20) Percent P.PersonaId, P.Nombre, P.Apellido
FROM Personas P





En algunos casos el set de resultado elimina cierta cantidad de filas que contienen los mismos valores dado un valor de ordenamiento. Si se desea incluir estos valores en el set de resultado, con la clausula TOP se debe especificar la sentencia WITH TIES después de especificar el valor numérico a retornar.

Select Top (3) P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
order by p.FechaNacimiento



Select Top (3) with ties P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
order by p.FechaNacimiento



En este último query, el resultado incluye otra fila en el set de resultado. Esto se da debido a la existencia de otro valor con la misma fecha de nacimiento.


Filtrado de datos con OFFSET-FETCH

La opción de filtrado con OFFSET-FETCH también permite especificar el filtrado a realizar por medio de un número de filas y ordenamiento. Este es muy útil para propósitos de paginación. La clausula OFFSET-FETCH requiere de la clausula order by ya que le indica a la clausula OFFSET-FETCH cuales son las filas que se deben filtrar y OFFSET puede existir sin FETCH, pero no FETCH sin OFFSET. Primero se especifica la clausula OFFSET seguido del número de filas a omitir y luego se especifica la clausula FETCH seguido del número de filas a filtrar.

En el siguiente ejemplo se omite la primera fila y se desea retornar las 2 siguientes filas.

Select P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
ORDER BY p.PersonaId
OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY;


Para hacer más intuitivo la sintaxis, se recomienda utilizar las clausulas NEXT y FIRST, cuándo se está realizando una omisión de algunas filas utilizar NEXT, cuándo no se está omitiendo filas utilizar FIRST.

Ejemplo 1:
Select P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
order by p.PersonaId
OFFSET 0 rows

Trae todas las filas de la tabla Personas, sin omitir alguna fila.



Ejemplo 2:
Select P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
order by p.PersonaId
OFFSET 2 rows

Omite las 2 primeras filas y trae el resto de filas en el set de resultado



Ejemplo 3:
Select P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
order by p.PersonaId
OFFSET 0 rows FETCH first 2 rows only

Trae la 2 primeras filas



Ejemplo 4:
Select P.PersonaId, P.Nombre, P.Apellido, P.FechaNacimiento
FROM Personas P
order by p.PersonaId
OFFSET 2 rows FETCH next 2 rows only

Omite las 2 primeras filas y trae las 2 filas siguientes






Comentarios

Entradas populares de este blog

Clases POCO y Clases DTO

INTELLITEST

INTERFACES C#