SQL analítico · funciones de ventana

ROWS BETWEEN y el marco de ventana

Controla exactamente qué filas participan en un acumulado o una métrica móvil para cada fila del resultado.

Lectura: 5–7 minSQL analíticoEjemplo comprobado
Contenido de esta guía

Qué es el marco de una ventana

En una función de ventana, la partición define el conjunto general de filas relacionadas y el frame o marco define qué subconjunto de esa partición participa en el cálculo para la fila actual.

Esta diferencia es especialmente importante con agregados como SUM, AVG, MIN o MAX usados con OVER. Un marco puede crecer, moverse o abarcar toda la partición.

ROWS BETWEEN: cuenta filas alrededor de la fila actual

SQL
SUM(importe) OVER (
  ORDER BY dia
  ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
)

2 PRECEDING significa “hasta dos filas anteriores”, no “dos días anteriores”. El significado depende de la posición de las filas dentro del ORDER BY de la ventana.

Ejemplo: suma móvil de tres filas

SQL comprobable en SQLite
WITH ventas(dia, importe) AS (
  VALUES ('2026-08-01', 10),
         ('2026-08-02', 20),
         ('2026-08-03', 30),
         ('2026-08-04', 40)
)
SELECT dia,
       importe,
       SUM(importe) OVER (
         ORDER BY dia
         ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
       ) AS suma_3_filas
FROM ventas
ORDER BY dia;
La ventana crece hasta tener tres filas
díaimportesuma_3_filas
011010
022030
033060
044090

Límites que debes reconocer

  • UNBOUNDED PRECEDING: desde el comienzo del marco.
  • CURRENT ROW: la fila actual en modo ROWS; en otros modos interviene también el concepto de filas pares.
  • n PRECEDING: n filas antes en un marco ROWS.
  • n FOLLOWING: n filas después en un marco ROWS.
  • UNBOUNDED FOLLOWING: hasta el final.

ROWS no es lo mismo que RANGE

ROWS cuenta filas físicas según el orden de la ventana. RANGE trabaja con el valor de ordenación y con sus pares, y sus reglas exactas para offsets dependen del motor. GROUPS trabaja por grupos de filas pares en motores que lo soportan.

Para aprender: empieza con ROWS cuando quieres una cantidad concreta de filas anteriores/siguientes. Añade una ordenación determinista si el resultado depende de cuál fila se considera anterior.

Error frecuente

Confundir partición y frame

PARTITION BY categoria puede delimitar todos los productos de una categoría, mientras que el frame puede usar solo las últimas tres filas de esa categoría para calcular una media móvil. Son dos niveles diferentes.

Comprueba lo aprendido

Intermedia · SQL analítico

Promedio de la fila actual y la anterior

Con una tabla ventas(dia, importe), escribe la expresión de ventana que calcule el promedio usando como máximo la fila actual y una fila anterior.

Compatibilidad

PostgreSQL, SQLite y MySQL documentan marcos para funciones de ventana, pero no todas las combinaciones de ROWS, RANGE, GROUPS y exclusiones tienen exactamente el mismo soporte o restricciones. Si buscas portabilidad, verifica la forma concreta en cada motor.

Qué debes recordar

  • La partición y el frame no son lo mismo.
  • ROWS permite expresar marcos mediante posiciones relativas de filas.
  • El ORDER BY de la ventana determina qué significa anterior y siguiente.
  • Los frames son esenciales para acumulados y métricas móviles controladas.

Conceptos relacionados

Fuentes técnicas