SQL analítico · funciones de ventana

OVER

Define sobre qué filas calcula una función de ventana sin perder el detalle de cada fila del resultado.

Lectura: 7–9 minEjemplos comprobadosPráctica con ventanas
Contenido de esta guía

Qué hace OVER

OVER convierte una función compatible en una función de ventana y define el conjunto de filas que esa función puede observar para calcular el valor de la fila actual.

La diferencia clave respecto a una agregación normal es que la consulta conserva cada fila. Puedes mostrar el pedido individual y, al mismo tiempo, calcular el total del cliente, una posición, un acumulado o una comparación con otra fila.

  • PARTITION BY divide el resultado en grupos independientes.
  • ORDER BY dentro de OVER define el orden lógico de la ventana cuando la función lo necesita.
  • Un frame puede limitar aún más qué filas de la partición intervienen.

Sintaxis

Forma general
funcion(...) OVER (
  PARTITION BY columna_grupo
  ORDER BY columna_orden
  ROWS BETWEEN ...
)

No todas las partes son obligatorias para todas las funciones. Por ejemplo, SUM(total) OVER (PARTITION BY cliente_id) necesita una partición pero no un orden si solo quieres repetir el total de cada cliente en todas sus filas.

Ejemplo guiado: total por cliente sin perder pedidos

Pedidos utilizados
idcliente_idtotal
11030
21045
32020
42015
SQL
SELECT id,
       cliente_id,
       total,
       SUM(total) OVER (PARTITION BY cliente_id) AS total_cliente
FROM pedidos
ORDER BY cliente_id, id;
Resultado comprobado
idcliente_idtotaltotal_cliente
1103075
2104575
3202035
4201535

El total se calcula por cliente, pero los cuatro pedidos permanecen visibles. Con GROUP BY cliente_id, en cambio, obtendrías una fila agregada por cliente.

El ORDER BY de OVER y el ORDER BY final tienen trabajos distintos

El ORDER BY dentro de OVER controla el orden lógico usado por la función de ventana. El ORDER BY al final del SELECT controla cómo se presentan las filas del resultado. Pueden coincidir, pero no son el mismo mecanismo.

ROW_NUMBER
SELECT id,
       cliente_id,
       total,
       ROW_NUMBER() OVER (
         PARTITION BY cliente_id
         ORDER BY total DESC, id
       ) AS posicion
FROM pedidos
ORDER BY cliente_id, posicion;

Cuándo aparece el window frame

En agregados usados como ventanas, un frame permite calcular acumulados o ventanas móviles. Una forma explícita y fácil de revisar es:

Acumulado
SUM(total) OVER (
  PARTITION BY cliente_id
  ORDER BY id
  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)

Si el resultado depende del frame, escribilo de forma explícita en lugar de confiar en un valor predeterminado que el lector pueda interpretar mal.

Errores frecuentes

!
Pensar que PARTITION BY agrupa el resultado

La partición divide la ventana para el cálculo; no colapsa filas. Esa es precisamente una de las diferencias con GROUP BY.

!
Suponer que ORDER BY dentro de OVER ordena la salida

Añade un ORDER BY final si la presentación del resultado necesita un orden garantizado.

Práctica: acumulado por cliente

Intermedia · ventana acumulada

Calcula cuánto lleva gastado cada cliente después de cada pedido

Usa los pedidos del ejemplo. Conserva cada fila y añade acumulado, reiniciando la suma cuando cambie cliente_id.

Pista 1

Particiona por cliente.

Pista 2

Ordena la ventana por id y usa un frame desde el comienzo de la partición hasta la fila actual.

Ver solución explicada
SELECT id,
       cliente_id,
       total,
       SUM(total) OVER (
         PARTITION BY cliente_id
         ORDER BY id
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS acumulado
FROM pedidos
ORDER BY cliente_id, id;

La suma se reinicia para cada cliente y avanza según el orden de id dentro de la partición.

Compatibilidad entre motores

PostgreSQL, SQL Server, MySQL moderno y SQLite disponen de funciones de ventana con OVER, pero las funciones disponibles, los tipos de frame y algunas restricciones no son idénticos. Verifica el dialecto cuando uses características más allá de PARTITION BY, ORDER BY y frames habituales.

Qué debes recordar

  • OVER define la ventana de cálculo y conserva las filas.
  • PARTITION BY reinicia el cálculo por grupo sin agrupar la salida.
  • El orden de la ventana y el orden final del resultado son conceptos distintos.

Conceptos relacionados

Fuentes técnicas consultadas