Problema:
Le gustaría dar a cada fila de la tabla de resultados un número separado.
Ejemplo:
Nuestra base de datos tiene una tabla llamada furniture
con datos en las siguientes columnas:code
(clave principal) y name
.
código | nombre |
---|---|
101 | cama |
202 | sofá |
333 | silla |
123 | estantería |
235 | tabla |
766 | escritorio |
Los furniture
tabla almacena el nombre de los muebles que queremos numerar.
Solución:
SELECT ROW_NUMBER() OVER() AS num_row, code, name FROM furniture;
La consulta devuelve el número de fila de cada mueble junto con su nombre y código:
núm_fila | nombre | código |
---|---|---|
1 | cama | 101 |
2 | sofá | 202 |
3 | silla | 333 |
4 | estantería | 123 |
5 | tabla | 235 |
6 | escritorio | 766 |
Tenga en cuenta que los nombres de los muebles no están ordenados.
Discusión:
Si desea numerar cada fila en un conjunto de resultados, SQL proporciona el ROW_NUMBER()
función. Esta función se usa en un SELECT
cláusula con otras columnas. Después del ROW_NUMBER()
cláusula, llamamos al OVER()
función. Si pasa algún argumento a OVER
, la numeración de las filas no se ordenará según ninguna columna. Por lo tanto, el orden de las filas mostradas no será determinista; en la mayoría de los casos, es el orden en que se insertaron los registros en la tabla. La numeración de filas comienza en 1. En nuestro ejemplo, cada registro tiene un número del 1 al 6.
También podemos asignar números de fila usando una columna. En el siguiente ejemplo, numeramos los registros ordenados por nombre. Hacemos esto pasando ese argumento a OVER
junto con ORDER BY
(ordena los registros según la columna del nombre):
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture;
Al observar el conjunto de resultados, verá las filas ordenadas con sus números:
fila | nombre | código |
---|---|---|
1 | cama | 101 |
2 | estantería | 123 |
3 | silla | 333 |
4 | escritorio | 766 |
5 | sofá | 202 |
6 | tabla | 235 |
La numeración proporcionada por ROW_NUMBER()
es independiente del orden de las filas en la tabla de resultados. En el siguiente ejemplo, numeramos los registros usando el nombre de la columna ordenada (OVER(ORDER BY name)
), pero mostramos registros en el conjunto de resultados según otra columna (en nuestro ejemplo, ORDER BY code
).
SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row, name, code FROM furniture ORDER BY code;
La consulta devolvió el número de cada fila, pero estos números no están en orden ascendente porque los registros se ordenan según el código de columna:
fila | nombre | código |
---|---|---|
1 | cama | 101 |
2 | estantería | 123 |
5 | sofá | 202 |
6 | tabla | 235 |
3 | silla | 333 |
4 | escritorio | 766 |
El orden predeterminado de las filas ordenadas es ascendente, pero también puede ordenarlas en orden descendente usando DESC
palabra clave después del nombre de la columna por la que desea ordenar:
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row, name, code FROM furniture ORDER BY code DESC;
La consulta anterior devolvió el conjunto de resultados:
fila | nombre | código |
---|---|---|
4 | escritorio | 766 |
3 | silla | 333 |
6 | tabla | 235 |
5 | sofá | 202 |
2 | estantería | 123 |
1 | cama | 101 |