QuieroProgramar por Rodri Gonzalez
SQL · Lección 11 de 15

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.

100–120 min Prerrequisitos: SQL 10
01

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
)
GROUP BY vs Window Functions: GROUP BY colapsa N filas en 1 fila por grupo. Window Functions calculan un valor para cada fila usando información del grupo, pero SIN colapsar. Es como tener el resultado del GROUP BY "pegado" al lado de cada fila original.

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
En el trabajo: "Ranking de vendedores por mes", "ventas acumuladas del año", "variación vs mes anterior", "top 3 clientes por sucursal" — todas son window functions. Son LA herramienta de análisis avanzado en SQL y aparecen en todas las entrevistas técnicas de Data Analyst.
02

Ejemplos explicados paso a paso

Ejemplo 1: ROW_NUMBER — ranking único

ejemplo_01_rownum.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: RANK y DENSE_RANK — manejar empates

ejemplo_02_rank.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: PARTITION BY — ranking dentro de cada grupo

ejemplo_03_partition.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: LAG/LEAD — comparar con período anterior

ejemplo_04_lag.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: SUM OVER — total acumulado y % del total

ejemplo_05_sum_over.sqlSQL

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Función Qué hace Requiere ORDER BY?
ROW_NUMBER() Ranking único (sin empates)
RANK() Ranking con empates (salta)
DENSE_RANK() Ranking con empates (no salta)
LAG(col, n) Valor n filas atrás
LEAD(col, n) Valor n filas adelante
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
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: ROW_NUMBER

Asigná un ranking por saldo descendente a cada cliente. Debe incluir 1.

ejercicio_01.sqlDebe incluir "1"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: SUM OVER — total acumulado

Mostrá ventas mensuales con total acumulado. Debe incluir acumulado.

ejercicio_02.sqlDebe incluir "acumulado"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: AVG OVER — promedio junto a cada fila

Mostrá cada cliente con el promedio general de saldo al lado. Debe incluir promedio.

ejercicio_03.sqlDebe incluir "promedio"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: PARTITION BY — ranking por ciudad

Ranking de saldo dentro de cada ciudad. Debe incluir ranking_ciudad.

ejercicio_04.sqlDebe incluir "ranking_ciudad"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: LAG — mes anterior

Mostrá ventas con el valor del mes anterior y la diferencia. Debe incluir anterior.

ejercicio_05.sqlDebe incluir "anterior"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: % del total con SUM OVER

Mostrá cada cliente con su % del saldo total. Debe incluir pct.

ejercicio_06.sqlDebe incluir "pct"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_07.sqlDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: Variación % mes a mes

Calculá la variación porcentual mes a mes con LAG. Debe incluir variacion_pct.

ejercicio_08.sqlDebe incluir "variacion_pct"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_09.sqlDebe incluir "prom_ciudad"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

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.

ejercicio_10.sqlDebe incluir "ranking"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (12 · INSERT, UPDATE, DELETE) vas a aprender a modificar datos: agregar, actualizar y eliminar registros.