Referencia de funciones

ROWS BETWEEN

Construcción SQL

Define el marco de la ventana: las filas de la partición con las que la función de ventana calcula el valor para la fila actual.

PostgreSQL 17.9
{ROWS | RANGE | GROUPS} BETWEEN frame_start AND frame_end [frame_exclusion]
  • [ ]parte opcional
  • { a | b }una de las opciones
ROWS | RANGE | GROUPS
Unidad de los límites: filas, valores de ORDER BY o grupos de filas iguales
Palabra clave
ROWSRANGEGROUPS
frame_start
Inicio del marco
Palabra clave
UNBOUNDED PRECEDINGoffset PRECEDINGCURRENT ROWoffset FOLLOWING
frame_end
Fin del marco, no anterior a su inicio
Palabra clave
offset PRECEDINGCURRENT ROWoffset FOLLOWINGUNBOUNDED FOLLOWING
frame_exclusion
Qué filas se excluyen del marco; ninguna por defecto
Palabra claveOpcional
EXCLUDE CURRENT ROWEXCLUDE GROUPEXCLUDE TIESEXCLUDE NO OTHERS

Valor devuelto

No devuelve ningún valor: define las filas para la función de ventana en OVER (...)

Ejemplos

Suma de los tres últimos pagos

PostgreSQL 17.9
SELECT payment_id,
	date,
	unit_price,
	SUM(unit_price) OVER (
		ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
	) AS last_three
FROM Payments
ORDER BY date;
payment_iddateunit_pricelast_three
152005-02-0388
12005-02-1220002008
62005-02-201002108
162005-03-1172107
172005-03-188115
22005-03-2321002115
182005-04-2082116
192005-05-1372115
32005-05-142035
232005-06-05300327

Suma acumulada por miembro de la familia

PostgreSQL 17.9
SELECT family_member,
	date,
	unit_price,
	SUM(unit_price) OVER (
		PARTITION BY family_member
		ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
	) AS running_total
FROM Payments
ORDER BY family_member,
	date;
family_memberdateunit_pricerunning_total
12005-02-0388
12005-02-1220002008
12005-03-1172015
12005-04-2082023
12005-05-1372030
12005-06-053002330
12006-01-151000012330
12006-03-121012340
22005-03-1888
22005-03-2321002108

Suma de los últimos 30 días

PostgreSQL 17.9
SELECT date,
	unit_price,
	SUM(unit_price) OVER (
		ORDER BY date RANGE BETWEEN INTERVAL '30 days' PRECEDING
			AND CURRENT ROW
	) AS last_30_days
FROM Payments
ORDER BY date;
dateunit_pricelast_30_days
2005-02-0388
2005-02-1220002008
2005-02-201002108
2005-03-1172107
2005-03-188115
2005-03-2321002115
2005-04-2082108
2005-05-13715
2005-05-142035
2005-06-05300327

ROWS, RANGE y GROUPS con precios iguales

PostgreSQL 17.9
SELECT unit_price,
	COUNT(*) OVER (
		ORDER BY unit_price ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
	) AS rows_frame,
	COUNT(*) OVER (
		ORDER BY unit_price RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
	) AS range_frame,
	COUNT(*) OVER (
		ORDER BY unit_price GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
	) AS groups_frame
FROM Payments
ORDER BY unit_price;
unit_pricerows_framerange_framegroups_frame
7122
7222
8355
8455
8555
10664
16772
20882
59992
10010113

Detalles

Límites: UNBOUNDED PRECEDING es el inicio de la partición, offset PRECEDING está offset filas antes de la actual, CURRENT ROW es la fila actual, offset FOLLOWING está offset filas después y UNBOUNDED FOLLOWING es el final de la partición. Con RANGE, el desplazamiento se indica en unidades de ORDER BY, por ejemplo INTERVAL '30 days' para fechas.

Si no se indica marco, con ORDER BY va desde el inicio de la partición hasta la fila actual, incluidas todas las filas con el mismo valor de ORDER BY (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW); sin ORDER BY, es toda la partición. Por eso LAST_VALUE y NTH_VALUE sin un marco explícito suelen dar algo inesperado.

EXCLUDE CURRENT ROW quita del marco la fila actual; EXCLUDE GROUP, la fila actual y las filas con el mismo valor de ORDER BY; EXCLUDE TIES, solo esas filas iguales. El marco no afecta a las funciones de rango, ni a LAG ni a LEAD.

Véase también

Dónde aprenderlo