ROWS BETWEEN
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.
{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 igualesPalabra claveROWSRANGEGROUPS
- frame_start
- Inicio del marcoPalabra claveUNBOUNDED PRECEDINGoffset PRECEDINGCURRENT ROWoffset FOLLOWING
- frame_end
- Fin del marco, no anterior a su inicioPalabra claveoffset PRECEDINGCURRENT ROWoffset FOLLOWINGUNBOUNDED FOLLOWING
- frame_exclusion
- Qué filas se excluyen del marco; ninguna por defectoPalabra claveOpcionalEXCLUDE 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
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;Suma acumulada por miembro de la familia
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;Suma de los últimos 30 días
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;ROWS, RANGE y GROUPS con precios iguales
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;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.