SQL Server

ROW_NUMBER() en SQL Server explicado fácil: rankings reales y ejercicios paso a paso

Publicado por J. Panduro hace 4 meses

ROW_NUMBER() en SQL Server explicado fácil: rankings reales y ejercicios paso a paso

Cuando trabajas con reportes empresariales, rankings o análisis de datos, muchas veces necesitas numerar filas dinámicamente. Aquí es donde ROW_NUMBER() se convierte en una herramienta muy poderosa en SQL Server.


ROW_NUMBER() se usa para:

  1. Crear rankings
  2. Numerar resultados
  3. Obtener TOP por grupos
  4. Paginación
  5. Reportes avanzados

En este artículo aprenderás:

  1. Qué es ROW_NUMBER()
  2. Cómo funciona
  3. Rankings reales
  4. Casos empresariales
  5. Ejercicios tipo entrevista


¿Qué es ROW_NUMBER()?


ROW_NUMBER() es una función de ventana (Window Function) de SQL Server que asigna un número secuencial único a cada fila de un conjunto de resultados. La numeración comienza en 1 y se incrementa de forma consecutiva según el criterio de ordenamiento definido por el desarrollador.


Esta función es especialmente útil cuando se necesita identificar, ordenar o numerar registros dentro de una consulta sin modificar los datos almacenados en la tabla. A diferencia de una columna IDENTITY, el valor generado por ROW_NUMBER() existe únicamente durante la ejecución de la consulta y no se guarda permanentemente en la base de datos.


Para determinar el orden de la numeración, ROW_NUMBER() requiere el uso de la cláusula ORDER BY dentro de la función. De esta manera, SQL Server sabe cómo asignar los números a cada fila del resultado.


Una de las aplicaciones más comunes de ROW_NUMBER() es la paginación de resultados en aplicaciones web. También se utiliza para generar rankings, identificar registros duplicados, obtener los primeros registros de cada grupo o crear reportes donde sea necesario mostrar una numeración secuencial.


ROW_NUMBER() OVER (
ORDER BY columna
)


Partes importantes


ROW_NUMBER()

Es la función encargada de generar la numeración secuencial para cada fila del conjunto de resultados. SQL Server asigna un número único a cada registro siguiendo el orden definido en la consulta. La numeración siempre comienza en 1 y aumenta de forma consecutiva.

Esta función no modifica los datos almacenados en la tabla; únicamente genera la secuencia mientras se ejecuta la consulta.


OVER()

La cláusula OVER() indica a SQL Server que la función debe operar sobre un conjunto de filas. En otras palabras, define la ventana de datos sobre la cual se realizará el cálculo.

Sin la cláusula OVER(), la función ROW_NUMBER() no puede ejecutarse, ya que SQL Server necesita saber cómo procesar los registros para generar la numeración.


Además, dentro de OVER() pueden incluirse opciones avanzadas como PARTITION BY y ORDER BY, que permiten controlar con mayor precisión el comportamiento de la función.


ORDER BY

La cláusula ORDER BY es obligatoria dentro de ROW_NUMBER() porque determina el orden en que SQL Server asignará los números a cada fila.

Por ejemplo, si se ordena por fecha de registro, el primer número será asignado al registro más antiguo o más reciente según el criterio utilizado. Si se ordena por nombre, la numeración seguirá el orden alfabético correspondiente.


Elegir correctamente el criterio de ordenamiento es fundamental, ya que un cambio en ORDER BY producirá una numeración diferente.


-- 1. Limpiar tabla
IF OBJECT_ID('Ventas', 'U') IS NOT NULL
DROP TABLE Ventas;

-- 2. Crear tabla
CREATE TABLE Ventas (
IdVenta INT IDENTITY(1,1) PRIMARY KEY,
Producto VARCHAR(100) NOT NULL,
Categoria VARCHAR(50) NOT NULL,
Cliente VARCHAR(100) NOT NULL,
Total DECIMAL(10,2) NOT NULL
);

-- 3. Insertar datos
INSERT INTO Ventas (Producto, Categoria, Cliente, Total)
VALUES
('Laptop', 'Tecnología', 'Juan Pérez', 2500.00),
('Mouse', 'Tecnología', 'Ana López', 80.00),
('Teclado', 'Tecnología', 'Juan Pérez', 150.00),
('Monitor', 'Tecnología', 'Carlos Ruiz', 900.00),
('Silla', 'Muebles', 'Ana López', 450.00),
('Escritorio', 'Muebles', 'Juan Pérez', 700.00),
('Tablet', 'Tecnología', 'Carlos Ruiz', 1200.00);


Primer ejemplo de ROW_NUMBER()


Numerar ventas del mayor al menor.


SELECT
Producto,
Total,
ROW_NUMBER() OVER (
ORDER BY Total DESC
) AS Ranking
FROM Ventas;




¿Cómo funciona?


SQL:

  1. Ordena por TOTAL DESC
  2. Asigna números secuenciales


Ranking de clientes


Obtener clientes ordenados por gasto total.


WITH RankingClientes AS (
SELECT
Cliente,
SUM(Total) AS TotalGastado
FROM Ventas
GROUP BY Cliente
)
SELECT
Cliente,
TotalGastado,
ROW_NUMBER() OVER (
ORDER BY TotalGastado DESC
) AS Ranking
FROM RankingClientes;


ROW_NUMBER() + PARTITION BY


Aquí subimos de nivel

Crear rankings por categoría.


SELECT
Categoria,
Producto,
Total,

ROW_NUMBER() OVER (
PARTITION BY Categoria
ORDER BY Total DESC
) AS RankingCategoria

FROM Ventas;


¿Qué hace PARTITION BY?


Divide los datos en grupos.

En este caso:

  1. Un ranking para Tecnología
  2. Otro ranking para Muebles




Paginación con ROW_NUMBER()


Muy usada en sistemas web.


WITH DatosPaginados AS (
SELECT
Producto,
Total,

ROW_NUMBER() OVER (
ORDER BY Total DESC
) AS Fila

FROM Ventas
)
SELECT *
FROM DatosPaginados
WHERE Fila BETWEEN 1 AND 3;


Ejercicios tipo entrevista


Nivel intermedio


Crear ranking de clientes por gasto total.


WITH Clientes AS (
SELECT
Cliente,
SUM(Total) AS Gastado
FROM Ventas
GROUP BY Cliente
)
SELECT
Cliente,
Gastado,

ROW_NUMBER() OVER (
ORDER BY Gastado DESC
) AS Ranking

FROM Clientes;


Nivel entrevista real


👉 Obtener el producto más caro por categoría.


WITH Productos AS (
SELECT
Categoria,
Producto,
Total,

ROW_NUMBER() OVER (
PARTITION BY Categoria
ORDER BY Total DESC
) AS Ranking

FROM Ventas
)
SELECT *
FROM Productos
WHERE Ranking = 1;



Ejercicio tipo empresa


Mostrar:

  1. Ranking de ventas
  2. Solo TOP 3 productos más caros


WITH RankingVentas AS (
SELECT
Producto,
Total,

ROW_NUMBER() OVER (
ORDER BY Total DESC
) AS Ranking

FROM Ventas
)
SELECT *
FROM RankingVentas
WHERE Ranking <= 3;


Conclusión


La función ROW_NUMBER() es una de las herramientas más útiles y utilizadas de SQL Server cuando se necesita asignar una numeración secuencial a los resultados de una consulta. Aunque su sintaxis es relativamente sencilla, sus aplicaciones en escenarios reales son muy amplias y permiten resolver problemas comunes de forma eficiente y profesional.


A lo largo de este artículo aprendimos cómo funciona ROW_NUMBER(), cuáles son sus componentes principales y cómo utilizarla para generar numeraciones, rankings y clasificaciones sobre conjuntos de datos. También vimos la importancia de las cláusulas OVER(), ORDER BY y PARTITION BY para controlar la forma en que SQL Server asigna los números a cada registro.


En el ámbito empresarial, esta función es ampliamente utilizada para generar rankings de ventas, clasificaciones de empleados, reportes gerenciales, análisis de clientes, sistemas de paginación y procesos de auditoría. Gracias a su flexibilidad, permite obtener información más organizada y facilitar la toma de decisiones basada en datos.


Además, ROW_NUMBER() suele combinarse con otras funciones de ventana para realizar análisis más avanzados, convirtiéndose en una herramienta indispensable para desarrolladores, analistas de datos y administradores de bases de datos que trabajan con SQL Server.

Sobre el autor

J. Panduro es desarrollador de software y creador de HPanduDigital. Comparte contenido sobre Desarrollo Web, inteligencia artificial, y transformación digital, basado en experiencias reales y proyectos prácticos.

Buscar artículos

Escribe al menos 2 caracteres para buscar.