Tutorial de SQL

Cómo usar ROW_NUMBER en SQL (funciones de ventana)

ROW_NUMBER() numera las filas 1, 2, 3… en el orden que indiques dentro de OVER, y es perfecta para rankings. Es una función de ventana: calcula mirando otras filas, pero sin juntarlas, así que cada fila sigue apareciendo con una columna nueva. Aquí verás la sintaxis, un ranking resuelto por promedio y cómo desempatar.

Funciones de ventana: ROW_NUMBER

Una función de ventana calcula algo mirando otras filas, pero sin juntarlas: cada fila sigue apareciendo y gana una columna nueva. Se reconocen porque llevan OVER (…).

ROW_NUMBER() numera las filas 1, 2, 3… en el orden que digas dentro de OVER. Es perfecta para rankings: «lugar 1, lugar 2…».

Cómo se escribe

SELECT ROW_NUMBER() OVER (ORDER BY columna DESC) AS lugar, … FROM tabla ORDER BY lugar

ROW_NUMBER()
número consecutivo para cada fila
OVER (ORDER BY … DESC)
en qué orden se numeran
ORDER BY lugar
el orden en que se muestra el resultado (es aparte)

Ejemplo resuelto

SELECT ROW_NUMBER() OVER (ORDER BY promedio DESC) AS lugar, nombre, promedio FROM alumnos ORDER BY lugar
Número de fila#lugarnombrepromedio
11Regina Salinas9.8
22Valeria Núñez9.4
33Sebastián Lara9.1
44Mateo Guzmán8.9
55Camila Ortega8.6
66Ximena Paz8.1
77Emiliano Rojas7.8
88Diego Cárdenas7.2
99Santiago Flores6.9
1010Renata Campos5.9

Ranking de alumnos por promedio: el mejor es el lugar 1.

En SQL Server: En SQL Server se escribe exactamente igual.

  • El ORDER BY de dentro de OVER decide la numeración; el de afuera, cómo se ve la tabla. Son independientes.
  • El WHERE se aplica antes de numerar: las facturas canceladas no ocupan lugar.
  • Si dos filas empatan, ROW_NUMBER les da números distintos al azar: agrega una segunda columna en OVER para desempatar.

Preguntas frecuentes

¿Qué es una función de ventana en SQL?

Una función que calcula algo mirando otras filas sin agruparlas: cada fila sigue apareciendo y gana una columna nueva. Se reconocen porque llevan OVER (…).

¿Qué diferencia hay entre el ORDER BY de OVER y el de afuera?

El de dentro de OVER decide la numeración; el de afuera, el orden en que se muestra la tabla. Son independientes.

¿Qué hace ROW_NUMBER con los empates?

Les da números distintos sin un orden fijo. Agrega una segunda columna en el ORDER BY de OVER para desempatar.