¡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!
Comments