
Resumen: en este tutorial, aprenderás a usar la función ROW_NUMBER()
de SQL Server para asignar un entero secuencial a cada fila de un conjunto de resultados.
Introducción a la función ROW_NUMBER() de SQL Server
ROW_NUMBER()
es una función que asigna un número entero secuencial a cada fila dentro de la partición de un conjunto de resultados. El número de fila comienza con 1 para la primera fila de cada partición.
A continuación se muestra la sintaxis de la función ROW_NUMBER()
:
ROW_NUMBER() OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
Examinemos la sintaxis de la función ROW_NUMBER()
en detalle.
PARTITION BY
La cláusula PARTITION BY
divide el conjunto de resultados en particiones (otro término para grupos de filas). La función ROW_NUMBER()
se aplica a cada partición por separado y reinicializa el número de fila para cada partición.
La cláusula PARTITION BY
es opcional. Si la omites, la función ROW_NUMBER()
tratará todo el conjunto de resultados como una única partición.
ORDER BY
La cláusula ORDER BY
define el orden lógico de las filas dentro de cada partición del conjunto de resultados. La cláusula ORDER BY es obligatoria porque la función ROW_NUMBER()
es sensible al orden.
Ejemplos de ROW_NUMBER() de SQL Server
Usaremos la tabla sales.customers
de la base de datos de muestra para demostrar la función ROW_NUMBER()
.
Uso de la función ROW_NUMBER() de SQL Server
La siguiente declaración usa ROW_NUMBER()
para asignar a cada fila de cliente un número secuencial:
SELECT
ROW_NUMBER() OVER (
ORDER BY first_name
) row_num,
first_name,
last_name,
city
FROM
sales.customers;
Resultado parcial, solamente se muestran 10 registros:
row_num | first_name | last_name | city |
---|---|---|---|
1 | Aaron | Knapp | Yonkers |
2 | Abbey | Pugh | Forest Hills |
3 | Abby | Gamble | Amityville |
4 | Abram | Copeland | Harlingen |
5 | Adam | Henderson | Los Banos |
6 | Adam | Thornton | Central Islip |
7 | Addie | Hahn | Franklin Square |
8 | Adelaida | Hancock | San Pablo |
9 | Adelle | Larsen | East Northport |
10 | Adena | Blake | Ballston Spa |
En este ejemplo, omitimos la cláusula PARTITION BY
, por lo tanto, ROW_NUMBER()
trató todo el conjunto de resultados como una sola partición.
Ejemplo de uso de SQL Server ROW_NUMBER() usando particiones
El siguiente ejemplo usa la función ROW_NUMBER()
para asignar un entero secuencial a cada cliente. Restablece el número cuando cambia la ciudad:
SELECT
first_name,
last_name,
city,
ROW_NUMBER() OVER (
PARTITION BY city
ORDER BY first_name
) row_num
FROM
sales.customers
ORDER BY
city;
Resultado parcial, solamente se muestran 10 registros:
first_name | last_name | city | row_num |
---|---|---|---|
Douglass | Blankenship | Albany | 1 |
Mi | Gray | Albany | 2 |
Priscilla | Wilkins | Albany | 3 |
Andria | Rivers | Amarillo | 1 |
Delaine | Estes | Amarillo | 2 |
Jonell | Rivas | Amarillo | 3 |
Luis | Tyler | Amarillo | 4 |
Narcisa | Knapp | Amarillo | 5 |
Abby | Gamble | Amityville | 1 |
Barton | Cox | Amityville | 2 |
En este ejemplo, usamos la cláusula PARTITION BY
para dividir los clientes en particiones por ciudad. El número de fila se reinicializaba cuando cambiaba la ciudad.
Usando SQL Server ROW_NUMBER() usando paginación
La función ROW_NUMBER()
es útil para la paginación en aplicaciones. Por ejemplo, puedes mostrar una lista de clientes por página, donde cada página tiene 10 filas.
El siguiente ejemplo usa ROW_NUMBER()
para devolver clientes de la fila 11 a la 20, que es la segunda página:
WITH cte_customers AS (
SELECT
ROW_NUMBER() OVER(
ORDER BY
first_name,
last_name
) row_num,
customer_id,
first_name,
last_name
FROM
sales.customers
) SELECT
customer_id,
first_name,
last_name
FROM
cte_customers
WHERE
row_num > 20 AND
row_num <= 30;
Resultado parcial, solamente se muestran 10 registros:
customer_id | first_name | last_name |
---|---|---|
735 | Aide | Franco |
952 | Aileen | Marquez |
384 | Aimee | Merritt |
1058 | Aisha | Woods |
158 | Alane | Kennedy |
697 | Alane | Mccarty |
442 | Alane | Munoz |
1061 | Alanna | Barry |
1219 | Alden | Atkinson |
475 | Alec | Peck |
En este ejemplo:
- Primero, el
CTE
utilizó la funciónROW_NUMBER()
para asignar a cada fila del conjunto de resultados un número entero secuencial. - En segundo lugar, la consulta externa devolvió las filas de la segunda página, que tienen el número de fila entre 11 y 20.
En este tutorial, aprendiste a usar la función ROW_NUMBER()
de SQL Server para asignar un entero secuencial a cada fila dentro de una partición de una consulta.