Window Functions
Las funciones de ventana calculan valores sobre un conjunto de filas relacionadas SIN colapsar el resultado (a diferencia de GROUP BY). Podés agregar un ranking, comparar con la fila anterior, o calcular totales acumulados — manteniendo cada fila individual visible.
Concepto teórico
¿Qué es una Window Function?
Una función de ventana opera sobre un "marco" (window) de filas relacionadas con la fila actual, pero sin
agrupar — cada fila del resultado se mantiene. La sintaxis usa OVER():
funcion() OVER (
PARTITION BY columna -- divide en grupos (opcional)
ORDER BY columna -- ordena dentro de cada grupo
)
Funciones de ranking
| Función | Empates | Ejemplo (scores: 810, 720, 720, 680) |
|---|---|---|
ROW_NUMBER() |
Ignora (siempre únicos) | 1, 2, 3, 4 |
RANK() |
Mismo rango, salta | 1, 2, 2, 4 (salta 3) |
DENSE_RANK() |
Mismo rango, NO salta | 1, 2, 2, 3 |
LAG y LEAD — acceder a filas anteriores/siguientes
LAG(col, n) trae el valor de n filas ANTES. LEAD(col, n) trae el valor
de n filas DESPUÉS. Perfectos para comparar con el período anterior:
SELECT mes, ventas,
LAG(ventas, 1) OVER (ORDER BY mes) AS ventas_mes_anterior,
ventas - LAG(ventas, 1) OVER (ORDER BY mes) AS variacion
FROM ventas_mensuales;
Agregaciones con OVER
Las funciones de agregación (SUM, AVG, COUNT) también funcionan como window functions:
-- Total acumulado (running total) SUM(monto) OVER (ORDER BY fecha) AS acumulado -- Promedio del grupo junto a cada fila AVG(saldo) OVER (PARTITION BY ciudad) AS promedio_ciudad -- % del total del grupo saldo * 100.0 / SUM(saldo) OVER (PARTITION BY ciudad) AS pct_ciudad
Ejemplos explicados paso a paso
Ejemplo 1: ROW_NUMBER — ranking único
Hacé clic en ▶ Ejecutar
Ejemplo 2: RANK y DENSE_RANK — manejar empates
Hacé clic en ▶ Ejecutar
Ejemplo 3: PARTITION BY — ranking dentro de cada grupo
Hacé clic en ▶ Ejecutar
Ejemplo 4: LAG/LEAD — comparar con período anterior
Hacé clic en ▶ Ejecutar
Ejemplo 5: SUM OVER — total acumulado y % del total
Hacé clic en ▶ Ejecutar
Referencia rápida
| Función | Qué hace | Requiere ORDER BY? |
|---|---|---|
ROW_NUMBER() |
Ranking único (sin empates) | Sí |
RANK() |
Ranking con empates (salta) | Sí |
DENSE_RANK() |
Ranking con empates (no salta) | Sí |
LAG(col, n) |
Valor n filas atrás | Sí |
LEAD(col, n) |
Valor n filas adelante | Sí |
SUM() OVER() |
Suma acumulada / por grupo | Opcional |
AVG() OVER() |
Promedio del grupo junto a cada fila | Opcional |
| Cláusula OVER | Significado |
|---|---|
OVER () |
Toda la tabla como una sola ventana |
OVER (ORDER BY col) |
Orden para acumulados/ranking |
OVER (PARTITION BY col) |
Dividir en grupos (como GROUP BY pero sin colapsar) |
OVER (PARTITION BY c1 ORDER BY c2) |
Grupos + orden dentro de cada grupo |
Ejercicios
Ejercicio 1: ROW_NUMBER
Asigná un ranking por saldo descendente a cada cliente. Debe incluir 1.
Hacé clic en ▶ Ejecutar
Ejercicio 2: SUM OVER — total acumulado
Mostrá ventas mensuales con total acumulado. Debe incluir acumulado.
Hacé clic en ▶ Ejecutar
Ejercicio 3: AVG OVER — promedio junto a cada fila
Mostrá cada cliente con el promedio general de saldo al lado. Debe incluir promedio.
Hacé clic en ▶ Ejecutar
Ejercicio 4: PARTITION BY — ranking por ciudad
Ranking de saldo dentro de cada ciudad. Debe incluir ranking_ciudad.
Hacé clic en ▶ Ejecutar
Ejercicio 5: LAG — mes anterior
Mostrá ventas con el valor del mes anterior y la diferencia. Debe incluir anterior.
Hacé clic en ▶ Ejecutar
Ejercicio 6: % del total con SUM OVER
Mostrá cada cliente con su % del saldo total. Debe incluir pct.
Hacé clic en ▶ Ejecutar
Ejercicio 7: Top N por grupo con PARTITION BY
Top 2 clientes por ciudad usando ROW_NUMBER + PARTITION BY en una CTE. Debe incluir Pérez.
Hacé clic en ▶ Ejecutar
Ejercicio 8: Variación % mes a mes
Calculá la variación porcentual mes a mes con LAG. Debe incluir variacion_pct.
Hacé clic en ▶ Ejecutar
Ejercicio 9: Promedio móvil
Calculá el promedio de saldo por ciudad junto a cada cliente (PARTITION BY sin ORDER BY). Debe incluir
prom_ciudad.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Dashboard analítico completo
Para cada cliente mostrá: ranking general, ranking por ciudad, saldo, promedio general, promedio de su
ciudad, diferencia vs promedio, y % del total. Debe incluir ranking.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- Window Functions calculan sobre un grupo SIN colapsar filas (a diferencia de GROUP BY).
ROW_NUMBER, RANK, DENSE_RANKpara rankings.LAG, LEADpara comparar con filas vecinas.PARTITION BYdivide la ventana en grupos.ORDER BYordena dentro de cada grupo.SUM/AVG OVER()calcula totales/promedios sin colapsar.- Top N por grupo:
ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) + WHERE rn <= N.
En la siguiente lección (12 · INSERT, UPDATE, DELETE) vas a aprender a modificar datos: agregar, actualizar y eliminar registros.