FORMULA & SQL / TOTALS
Moving average.
Tested, not guessed.
The Excel and Google Sheets formula and the SQL query, each run on the rows below. Open this with your own data ↗
The example rows
| Row | A: Region | B: Rep | C: Amount | D: Order Date | E: Status | F: Customer |
|---|---|---|---|---|---|---|
| 2 | North | Ana | 1,200 | 2026-03-01 | Paid | Jo Smith |
| 3 | South | Ben | 450 | 2026-03-15 | Open | Raj Patel |
| 4 | North | Cy | 300 | 2026-04-02 | Paid | Lee Wong |
| 5 | East | Ana | 980.50 | 2026-04-20 | Paid | Mia Ross |
| 6 | North | Ben | 75 | 2026-05-05 | Open | Jo Smith |
| 7 | West | Dee | 1,640 | 2026-05-18 | Paid | Sam Okoro |
The formula
Excel
=AVERAGE(C2:C4)
The average of the Amount column (C2:C4).
Fill it down; the data must already be sorted.
Run on the example rows:
Result650
The SQL
PostgreSQL
SELECT *, AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average FROM sales
Run on the example rows:
| region | rep | amount | order_date | status | customer | moving_average |
|---|---|---|---|---|---|---|
| North | Ana | 1200 | 2026-03-01 | Paid | Jo Smith | 1200 |
| South | Ben | 450 | 2026-03-15 | Open | Raj Patel | 825 |
| North | Cy | 300 | 2026-04-02 | Paid | Lee Wong | 650 |
| East | Ana | 980.5 | 2026-04-20 | Paid | Mia Ross | 576.8333 |
| North | Ben | 75 | 2026-05-05 | Open | Jo Smith | 451.8333 |
| West | Dee | 1640 | 2026-05-18 | Paid | Sam Okoro | 898.5 |
Other databases
MySQL
SELECT *, AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average FROM sales
SQL Server
SELECT *, AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average FROM sales
SQLite
SELECT *, AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average FROM sales
BigQuery
SELECT *, AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average FROM sales
Snowflake
SELECT *, AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_average FROM sales
Your own data
Paste your rows into the free tool and it writes this for your columns, then runs it on your data before you copy it. Open the tool ↗