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
You can list several CTEs separated by commas under one WITH: WITH a AS (...), b AS (...) SELECT .... Each later CTE may read the earlier ones by name, so the query becomes a chain of small steps: summarize → filter → join.
Rule: a comma between CTEs, but NOT before the main SELECT. Definition order matters — a CTE can only use ones defined before it.
A small step is easy to check: temporarily replace the main SELECT with SELECT * FROM step and look at the intermediate result.
Common mistakes: a comma before the main SELECT; repeating WITH for the second CTE; referring to a CTE defined further down; too many columns in intermediate steps.
Small example:
WITH a AS (SELECT customer_id, COUNT(*) AS n FROM orders GROUP BY customer_id), b AS (SELECT customer_id FROM a WHERE n >= 2) SELECT COUNT(*) AS repeat_customers FROM b;
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: name, spent · row order is not required
Expected result (displayed data):
Loading…You can list several CTEs separated by commas under one WITH: WITH a AS (...), b AS (...) SELECT .... Each later CTE may read the earlier ones by name, so the query becomes a chain of small steps: summarize → filter → join. Rule: a comma between CTEs, but NOT before the main SELECT. Definition order matters — a CTE can only use ones defined before it. A small step is easy to check: temporarily replace the main SELECT with SELECT * FROM step and look at the intermediate result. Common mistakes: a comma before the main SELECT; repeating WITH for the second CTE; referring to a CTE defined further down; too many columns in intermediate steps.
QUERY STANDBY
›