Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
SQL / POSTGRESQL / Learn / LESSON 09
When OVER contains ORDER BY the aggregate becomes cumulative: SUM(total) OVER (ORDER BY order_date, id) adds every row from the start up to the current one. That is a "running balance" or sales so far over time. With PARTITION BY, accumulation restarts in each group.
Important: ORDER BY inside OVER belongs to the window only. It does NOT sort the final result — to see rows in order, add a separate ORDER BY at the end, usually with the same columns.
Equal values in OVER (ORDER BY order_date) are "peers": by default the window is RANGE from the start through the current row AND its peers, so two orders on the same day get the same running sum. For a row-by-row total add a unique key: ORDER BY order_date, id.
Common mistakes: OVER (ORDER BY order_date) with no tie-breaker; a missing final ORDER BY; believing OVER ORDER BY sorts the output; accumulating over a NULL customer when that is unwanted.
Small example:
SELECT id, order_date, total, SUM(total) OVER (ORDER BY order_date, id) AS running_total FROM orders ORDER BY order_date, id;
Working tables for this task. Grading also uses other datasets with the same schema.
| id | name | category | price |
|---|---|---|---|
| 1 | Atlas | books | 30 |
| 2 | Novel | books | 15 |
| 3 | Comic | books | 14.99 |
| 4 | Lamp | home | 29.99 |
| 5 | Vase | home | 30 |
| 6 | Rug | home | 45 |
| 7 | Hammer | tools | 15 |
| 8 | Drill | tools | 60 |
| 9 | Tape | tools | 15 |
| 10 | Candle | NULL | 8.5 |
| 11 | Gift Card | NULL | 25 |
| id | name | city |
|---|---|---|
| 1 | Mira | Sofia |
| 2 | Niko | Varna |
| 3 | Iva | Sofia |
| 4 | Alex | NULL |
| 5 | Boris | Plovdiv |
| 6 | Lena | Varna |
| 7 | Petya | Sofia |
| id | customer_id | total | order_date |
|---|---|---|---|
| 1 | 1 | 120 | 2024-01-05 |
| 2 | 1 | 35.5 | 2024-01-20 |
| 3 | 2 | 40 | 2024-01-20 |
| 4 | 3 | 99.99 | 2024-01-31 |
| 5 | NULL | 60 | 2024-02-01 |
| 6 | 1 | 40 | 2024-02-01 |
| 7 | 2 | 75.25 | 2024-02-14 |
| 8 | 3 | 100 | 2024-02-15 |
| 9 | 5 | 22 | 2024-02-15 |
| 10 | 1 | 39.99 | 2024-02-29 |
| 11 | 2 | 55 | 2024-03-01 |
| 12 | 3 | 18 | 2024-03-10 |
| 13 | 1 | 130 | 2024-03-15 |
| 14 | 2 | 40 | 2024-03-15 |
| 15 | 2 | 12.5 | 2024-03-31 |
| 16 | 3 | 47 | 2024-04-01 |
Expected columns: id, order_date, total, running_total · row order is checked
Expected result (displayed data):
Loading…When OVER contains ORDER BY the aggregate becomes cumulative: SUM(total) OVER (ORDER BY order_date, id) adds every row from the start up to the current one. That is a "running balance" or sales so far over time. With PARTITION BY, accumulation restarts in each group. Important: ORDER BY inside OVER belongs to the window only. It does NOT sort the final result — to see rows in order, add a separate ORDER BY at the end, usually with the same columns. Equal values in OVER (ORDER BY order_date) are "peers": by default the window is RANGE from the start through the current row AND its peers, so two orders on the same day get the same running sum. For a row-by-row total add a unique key: ORDER BY order_date, id. Common mistakes: OVER (ORDER BY order_date) with no tie-breaker; a missing final ORDER BY; believing OVER ORDER BY sorts the output; accumulating over a NULL customer when that is unwanted.
QUERY STANDBY
›