top of page

Funciones de ventana (Window Functions) en SQL: ROW_NUMBER, RANK y PARTITION BY

¡Hola, comunidad! Hoy les voy a hablar de una de las características más potentes en SQL: las funciones de ventana o window functions. Estas funciones son esenciales cuando quieres realizar cálculos avanzados sobre tus datos sin alterar el conjunto total de filas. Hoy veremos las más comunes: ROW_NUMBER, RANK y PARTITION BY.


¿Qué son las funciones de ventana?

Las window functions permiten realizar cálculos sobre un conjunto específico de filas relacionadas (la ventana) dentro de una consulta SQL, sin agrupar los resultados. Esto te permite hacer cálculos como rankings, sumatorias parciales o contar filas de manera acumulada, sin modificar el número de filas en el resultado.


ROW_NUMBER, RANK y PARTITION BY: Qué hacen y cómo se usan

ROW_NUMBER() – Asignar un número único a cada fila La función ROW_NUMBER() asigna un número secuencial único a cada fila dentro de una partición de los datos. Este número reinicia para cada nueva partición.

Sintaxis:

SELECT 
	columna1, 
	columna2, 
	ROW_NUMBER() OVER (PARTITION BY columnaX ORDER BY columnaY) AS fila 
FROM tabla;

Ejemplo: Supongamos que tienes una tabla de empleados y quieres asignar un número de fila a cada empleado dentro de su departamento:

SELECT 
	nombre, 
	departamento, 
	ROW_NUMBER() OVER (PARTITION BY departamento ORDER BY salario DESC) AS fila 
FROM empleados;

RANK() – Asignar rangos a filas, con posibilidad de empates RANK() asigna un rango a cada fila dentro de una partición. A diferencia de ROW_NUMBER(), si dos o más filas tienen el mismo valor en la columna ordenada, recibirán el mismo rango y el siguiente rango será "saltado".

Ejemplo: Si dos empleados tienen el mismo salario, recibirán el mismo rango, pero la fila siguiente tendrá un salto en el ranking:

SELECT 
	nombre, 
	departamento, 
	RANK() OVER (PARTITION BY departamento ORDER BY salario DESC) AS rango 
FROM empleados;

Si dos empleados tienen el salario más alto, ambos serán rango 1, y el siguiente será rango .

PARTITION BY – Dividir los datos en particiones PARTITION BY es usado dentro de una función de ventana para dividir las filas en subgrupos o particiones antes de aplicar la función de ventana. Por ejemplo, puedes usar PARTITION BY para aplicar un ranking dentro de cada departamento.

Sintaxis:

SELECT columna1, columna2, FUNCION_DE_VENTANA() 
OVER (PARTITION BY columnaX ORDER BY columnaY) AS resultado 
FROM tabla;

Ejemplo: Si quieres asignar un número secuencial a cada empleado dentro de cada departamento:

SELECT 
	nombre, 
	departamento, 
	ROW_NUMBER() OVER (PARTITION BY departamento ORDER BY salario DESC) AS fila 
FROM empleados;

Esto asignará una fila numerada por empleado en cada departamento, reiniciando la numeración en cada partición (departamento).


Comparativa entre ROW_NUMBER(), RANK() y otras funciones

Función

Descripción

Empates

ROW_NUMBER

Asigna un número único a cada fila, sin considerar empates.

No, cada fila tiene un número único.

RANK

Asigna rangos a las filas, permitiendo empates.

Sí, filas con el mismo valor reciben el mismo rango, pero se salta al siguiente.

DENSE_RANK

Similar a RANK(), pero sin saltos en el ranking.

Sí, pero no salta al siguiente rango.

¿Cuándo usar estas funciones?

  • ROW_NUMBER() es ideal cuando necesitas un identificador único para cada fila, sin importar los empates en los datos.

  • RANK() es útil cuando deseas ordenar filas y respetar empates, pero es importante que el ranking refleje esos empates.

  • PARTITION BY es fundamental cuando quieres aplicar cualquier función de ventana a subconjuntos de tus datos (como departamentos, categorías, etc.).


Ejemplo completo

Imagina que tienes una tabla de ventas y deseas asignar un número de fila a cada venta dentro de cada país, y además, necesitas clasificar las ventas por ingresos.

SELECT 
	pais, 
	vendedor, 
	ingresos, 
	ROW_NUMBER() OVER (PARTITION BY pais ORDER BY ingresos DESC) AS fila, 
	RANK() OVER (PARTITION BY pais ORDER BY ingresos DESC) AS rango 
FROM ventas;

Este ejemplo asigna un número de fila y un rango a cada venta dentro de su país, basado en el monto de ingresos.


Conclusión

Las funciones de ventana en SQL son una herramienta increíblemente poderosa para realizar cálculos avanzados sin alterar el número de filas devueltas. Ya sea que quieras numerar filas, asignar rangos o dividir tus datos en particiones lógicas, funciones como ROW_NUMBER(), RANK() y PARTITION BY te ayudarán a realizar análisis más detallados y eficaces. ¡A ponerlas en práctica!


86 views

Comments


bottom of page