A primera vista puede parecer que SQL ya tiene todo para analizar datos: GROUP BY, agregados, subconsultas... Pero eso es solo el principio. Bienvenido al mundo de las funciones de ventana — una herramienta potente que te permite trabajar con los datos fila por fila, manteniendo todo el contexto.
Las funciones de ventana te dejan hacer cálculos — suma, media, rankings y más — sobre una “ventana” de filas, sin agrupar los datos. Eso significa que, a diferencia de las funciones agregadas normales (SUM(), AVG(), COUNT()), obtienes tanto el resultado como los detalles en cada fila.
Imagina que quieres calcular el ingreso acumulado por pedidos. Con GROUP BY perderías los pedidos concretos — solo quedaría la suma. Pero con una función de ventana, añades el resultado directamente a cada fila, sin perder nada.
Las funciones de ventana son especialmente cómodas porque no destruyen los datos: cada fila se queda en su sitio, y los resultados de los cálculos simplemente se añaden en nuevas columnas. Esto te permite hacer análisis complejos sin subconsultas ni estructuras pesadas — todo se hace directamente en una sola consulta. Estas funciones son perfectas para tareas como rankings, medias móviles o comparar valores entre filas. El código sigue siendo legible y el resultado — preciso.
¿Cuándo es especialmente útil?
- Ranking de empleados, vendedores, productos — quién está en qué puesto.
- Series temporales — cómo cambiaba algo por días o semanas.
- Ventas y finanzas — cuánto se ha acumulado en cada paso, qué pedidos están por encima de la media, quién está en el top 25%.
¿Dónde se usan las funciones de ventana?
En cualquier área donde importa el contexto, no solo el resultado final:
- informes de ventas;
- análisis del comportamiento de clientes;
- creación de gráficos con métricas acumulativas;
- segmentación de datos (por ejemplo, por cuartiles);
- cálculo de desviaciones y tendencias.
Son un verdadero hallazgo para los analistas que trabajan con SQL todos los días. Vamos a ver algunos ejemplos del mundo real donde las funciones de ventana pueden ser tu salvación.
Ejemplo 1: Ranking de datos
Imagina que tienes una lista de estudiantes con sus notas de examen. Quieres asignar a cada estudiante su posición en la clase. Con funciones de ventana esto es facilísimo. Por ejemplo, las funciones RANK() o ROW_NUMBER() te ayudan con esta tarea.
Ejemplo 2: Análisis de datos temporales
¿Y si necesitas ver cómo cambiaron los ingresos de la empresa por meses? Necesitas la suma acumulada de ingresos. Usando la función de ventana SUM() con una ventana definida, puedes conseguirlo fácilmente.
Ejemplo 3: Cuantiles y división en grupos
¿Dividir los datos en grupos iguales (por ejemplo, por ingresos) para segmentar clientes? Aquí te ayuda la función NTILE(). Vamos a ver quiénes están en el top 25% y quiénes están abajo en el ranking.
¿Cómo se ve esto?
Una función de ventana simplemente añade el resultado al conjunto final de datos:
SELECT
student_id,
grade,
RANK() OVER (ORDER BY grade DESC) AS rank
FROM
students;
Aquí obtenemos una tabla donde cada estudiante tiene su ranking único según la nota.
Una analogía sencilla
Imagina que estás corriendo con un grupo de amigos. Cada uno va a su ritmo, pero quieres saber en qué puesto vas en la carrera justo ahora. En vez de parar a todos y hacer una tabla de líderes (como hace GROUP BY), simplemente miras a los que corren a tu alrededor y ves tu ranking actual.
Eso es una función de ventana: no para la carrera, no divide a todos en grupos — solo añade información, manteniendo el movimiento y los detalles. Todos siguen corriendo, pero ahora tienes analítica extra — por ejemplo, cuántas personas tienes delante, cuál es tu ritmo comparado con la media, etc.
Ventajas frente a los enfoques tradicionales
Veamos una tarea clásica: calcular el ranking de vendedores por ingresos. Hay dos formas:
Sin funciones de ventana. Tienes que hacer una subconsulta o incluso varias, primero ordenar los datos y luego numerarlos. No solo es largo, también difícil de leer.
Con funciones de ventana. Solo una consulta con sintaxis bonita y clara, y ya tienes el resultado. Por ejemplo:
SELECT
seller_id,
revenue,
RANK() OVER (PARTITION BY region ORDER BY revenue DESC) AS rank_in_region
FROM
sales;
Esta consulta separa a los vendedores por regiones y los numera según sus ingresos de mayor a menor.
Ejemplo real
Ahora imagina que eres analista y analizas datos de ventas. Necesitas saber:
- ingresos totales por cada mes,
- cómo cambió el ingreso respecto al mes anterior,
- ranking de regiones por ingresos totales.
Todo esto se puede hacer usando funciones de ventana e incluso en una sola consulta. Pero eso ya es tema para las siguientes clases.
Ahora, con los conocimientos básicos sobre funciones de ventana, ya estás listo para pasar a su sintaxis y ver el poder de ROW_NUMBER(), RANK(), DENSE_RANK() y NTILE(). ¡Vamos a la siguiente lección!
GO TO FULL VERSION