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
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
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;| día | importe | suma_3_filas |
|---|---|---|
| 01 | 10 | 10 |
| 02 | 20 | 30 |
| 03 | 30 | 60 |
| 04 | 40 | 90 |
Límites que debes reconocer
UNBOUNDED PRECEDING: desde el comienzo del marco.CURRENT ROW: la fila actual en modoROWS; en otros modos interviene también el concepto de filas pares.n PRECEDING: n filas antes en un marcoROWS.n FOLLOWING: n filas después en un marcoROWS.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
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.
AVG(importe) OVER (...).dia.1 PRECEDING y termina en CURRENT ROW.Solución razonada
AVG(importe) OVER (
ORDER BY dia
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
)La primera fila se promedia consigo misma; desde la segunda, cada resultado usa dos filas como máximo.
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.
ROWSpermite 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.