Inicio > Cursos > SQL y Bases de Datos > Window Functions
SQL y Bases de DatosConsultas AvanzadasLección 10 de 20

Window Functions

Las Window Functions (funciones de ventana) realizan cálculos sobre un conjunto de filas relacionadas con la fila actual, sin colapsar los resultados como hace GROUP BY. Son perfectas para rankings, totales acumulados, comparaciones con fila anterior/siguiente.

-- Sintaxis: funcion() OVER (PARTITION BY ... ORDER BY ...)
-- PARTITION BY: divide en grupos (como GROUP BY pero mantiene filas)
-- ORDER BY: define el orden dentro de cada partición

-- ROW_NUMBER: número secuencial único en cada partición
-- Ranking de empleados por salario dentro de cada departamento
SELECT
  nombre,
  departamento,
  salario,
  ROW_NUMBER() OVER (PARTITION BY departamento ORDER BY salario DESC) AS posicion
FROM empleados;

-- RANK vs DENSE_RANK: manejo de empates
-- Con salarios: 5000, 5000, 4000
-- RANK():        1,    1,    3  (salta el 2)
-- DENSE_RANK():  1,    1,    2  (no salta)
SELECT
  nombre,
  salario,
  RANK() OVER (ORDER BY salario DESC) AS rank,
  DENSE_RANK() OVER (ORDER BY salario DESC) AS dense_rank
FROM empleados;

-- LAG y LEAD: acceder a filas anterior/siguiente
-- Crecimiento de ventas mes a mes
SELECT
  mes,
  ingresos,
  LAG(ingresos, 1, 0) OVER (ORDER BY mes) AS mes_anterior,
  LEAD(ingresos) OVER (ORDER BY mes) AS mes_siguiente,
  ingresos - LAG(ingresos) OVER (ORDER BY mes) AS diferencia
FROM ventas_mensuales;

-- SUM acumulativo (running total)
SELECT
  fecha,
  total AS venta_diaria,
  SUM(total) OVER (ORDER BY fecha) AS total_acumulado,
  AVG(total) OVER (
    ORDER BY fecha
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) AS promedio_7_dias
FROM orders
ORDER BY fecha;

-- Obtener el top 1 por grupo (equivalente a DISTINCT ON)
SELECT departamento, nombre, salario
FROM (
  SELECT departamento, nombre, salario,
    ROW_NUMBER() OVER (PARTITION BY departamento ORDER BY salario DESC) AS rn
  FROM empleados
) ranked
WHERE rn = 1;
ConsejoLas window functions se ejecutan DESPUÉS de WHERE y GROUP BY, pero ANTES de ORDER BY final. No puedes usarlas en WHERE — envuelve la consulta en una subconsulta o CTE y filtra en el exterior.
← CTEs con WITHNormalización de Base de Datos →

Practica esta lección

Resuelve los ejercicios del curso de SQL y Bases de Datos en la app, gratis y con corrección automática.

Empezar a practicar