A window frame can compute a rolling average over ordered days.

Program

Play the script to choose the first day included in a two-day moving average.

moving_average_days.sql
CREATE TABLE daily_sales (day TEXT, total INTEGER);
INSERT INTO daily_sales VALUES ('2026-03-01', 100), ('2026-03-02', 140), ('2026-03-03', 120), ('2026-03-04', 180);
WITH params(start_day) AS (VALUES ()) SELECT day, total, ROUND(AVG(total) OVER (ORDER BY day ROWS BETWEEN 1 PRECEDING AND CURRENT ROW), 1) AS two_day_avg FROM daily_sales WHERE day >= (SELECT start_day FROM params) ORDER BY day;
CREATE TABLE daily_sales (day TEXT, total INTEGER);
INSERT INTO daily_sales VALUES ('2026-03-01', 100), ('2026-03-02', 140), ('2026-03-03', 120), ('2026-03-04', 180);
WITH params(start_day) AS (VALUES ()) SELECT day, total, ROUND(AVG(total) OVER (ORDER BY day ROWS BETWEEN 1 PRECEDING AND CURRENT ROW), 1) AS two_day_avg FROM daily_sales WHERE day >= (SELECT start_day FROM params) ORDER BY day;
CREATE TABLE daily_sales (day TEXT, total INTEGER);
INSERT INTO daily_sales VALUES ('2026-03-01', 100), ('2026-03-02', 140), ('2026-03-03', 120), ('2026-03-04', 180);
WITH params(start_day) AS (VALUES ()) SELECT day, total, ROUND(AVG(total) OVER (ORDER BY day ROWS BETWEEN 1 PRECEDING AND CURRENT ROW), 1) AS two_day_avg FROM daily_sales WHERE day >= (SELECT start_day FROM params) ORDER BY day;
window frame `ROWS BETWEEN 1 PRECEDING AND CURRENT ROW` uses the current and previous row.
ordered days `ORDER BY day` defines the sequence for the rolling calculation.
fixed dates The example uses literal ISO dates so replay output is deterministic.