Funcion Row_Number() en SQL Server
La función ROW_NUMBER()
en SQL Server es una función de ventana que se utiliza para asignar un número secuencial único a las filas dentro de una partición de un conjunto de resultados, comenzando desde 1 para la primera fila en cada partición.
Sintaxis
ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY column1, column2, ...)
- PARTITION BY: Divide el conjunto de resultados en particiones a las que se aplica la función
ROW_NUMBER()
. Cada partición comienza el número de fila en 1. Esta cláusula es opcional. - ORDER BY: Especifica el orden en que se asignan los números de fila. Esta cláusula es obligatoria.
Uso y Ejemplos
1. Numerar todas las filas en una tabla
Si deseas numerar todas las filas en una tabla sin particionarlas, puedes usar ROW_NUMBER()
con solo la cláusula ORDER BY
SELECT
ROW_NUMBER() OVER (ORDER BY nombre) AS row_num,
id,
nombre,
salario
FROM
empleados;
Este ejemplo asignará un número de fila a cada fila en la tabla empleados
ordenándolas por la columna nombre
.
2. Numerar filas dentro de particiones
Si deseas numerar las filas dentro de particiones, utiliza la cláusula PARTITION BY
. Por ejemplo, numerar a los empleados por departamento
SELECT
ROW_NUMBER() OVER (PARTITION BY departamento_id ORDER BY salario DESC) AS row_num,
departamento_id,
id,
nombre,
salario
FROM
empleados;
En este ejemplo, se numerarán los empleados dentro de cada departamento_id
de acuerdo con el salario
en orden descendente. Cada partición de departamento_id
comenzará con ROW_NUMBER()
igual a 1.
Aplicaciones Comunes
- Paginar Resultados: Usar
ROW_NUMBER()
para paginar grandes conjuntos de resultados dividiéndolos en páginas. - Eliminar Duplicados: Identificar y eliminar filas duplicadas manteniendo solo una instancia de cada fila basada en un conjunto de columnas.
- Ordenar Datos: Asignar números de fila para ordenar datos en un conjunto de resultados.
Ejemplo de Paginación
Para paginar resultados, puedes usar ROW_NUMBER()
junto con una consulta CTE (Common Table Expression) para obtener un rango de filas específico.
-- Define el rango de filas para la página
DECLARE @PageNumber INT = 1;
DECLARE @RowsPerPage INT = 10;
WITH EmpleadosPaginados AS (
SELECT
ROW_NUMBER() OVER (ORDER BY nombre) AS row_num,
id,
nombre,
salario
FROM
empleados
)
SELECT
id,
nombre,
salario
FROM
EmpleadosPaginados
WHERE
row_num BETWEEN (@PageNumber - 1) * @RowsPerPage + 1 AND @PageNumber * @RowsPerPage;
En este ejemplo, estamos paginando los resultados de la tabla empleados
, obteniendo 10 filas por página. @PageNumber
y @RowsPerPage
son variables que puedes ajustar para obtener diferentes páginas de resultados.
Resumen
La función ROW_NUMBER()
es una herramienta poderosa para numerar filas, particionar conjuntos de resultados y facilitar tareas como paginación y eliminación de duplicados. Al asignar un número de fila único a cada fila dentro de una partición ordenada, proporciona flexibilidad para manipular y analizar datos en SQL Server.