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 05
PARTITION BY splits rows into independent windows — like groups, without collapsing. The aggregate is computed separately for each window and the value is returned on every row of it: COUNT(*) OVER (PARTITION BY customer_id) gives each order the number of orders of its customer.
You can partition by an expression, for example by month: AVG(total) OVER (PARTITION BY date_trunc('month', order_date)). Rows with NULL in the key form one shared window, so we often filter WHERE customer_id IS NOT NULL (WHERE runs before the window and decides which rows take part).
Result order is not guaranteed without ORDER BY.
Common mistakes: PARTITION BY without OVER; confusing PARTITION BY with GROUP BY (it does not collapse rows); forgetting that NULL keys share one window; expecting a particular row order.
Small example:
SELECT id, customer_id, total, MAX(total) OVER (PARTITION BY customer_id) AS best_order FROM orders WHERE customer_id IS NOT NULL;
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, customer_id, total, customer_orders · row order is not required
Expected result (displayed data):
Loading…PARTITION BY splits rows into independent windows — like groups, without collapsing. The aggregate is computed separately for each window and the value is returned on every row of it: COUNT(*) OVER (PARTITION BY customer_id) gives each order the number of orders of its customer. You can partition by an expression, for example by month: AVG(total) OVER (PARTITION BY date_trunc('month', order_date)). Rows with NULL in the key form one shared window, so we often filter WHERE customer_id IS NOT NULL (WHERE runs before the window and decides which rows take part). Result order is not guaranteed without ORDER BY. Common mistakes: PARTITION BY without OVER; confusing PARTITION BY with GROUP BY (it does not collapse rows); forgetting that NULL keys share one window; expecting a particular row order.
QUERY STANDBY
›