task ROW_NUMBER · medium
First order versus latest order
For shoppers with at least two non-cancelled orders, return shopper_id, first_order_value and latest_order_value. An order's value is the sum of its lines' quantity × unit_price.
what to return
- Columns
shopper_idfirst_order_valuelatest_order_valuein this order- Rows
- 10 rows · any order
- Watch for
- “First” and “latest” go by order_date; on the same date, the higher order id is later.
- Round values to 2 decimals.
- Skill
- Pick first and last rows per group, not minimum and maximum values. Refresher: FIRST_VALUE, LAST_VALUE & frames →
expected result
Your query should return exactly these columns and values. Run it and compare.
expected result10 rows · any order
| shopper_id | first_order_value | latest_order_value |
|---|---|---|
| 1 | 78 | 118 |
| 2 | 59 | 48 |
| 3 | 149 | 108.5 |
first 3 of 10 rows
data you can query
Sample rows from each table. Each column shows its type underneath; → marks a link to another table.
sales_orders5 columns · 33 rows
| idinteger · key | shopper_idinteger → shoppers | order_datetext | statustext | delivered_datetext |
|---|---|---|---|---|
| 101 | 1 | 2025-01-04 | delivered | 2025-01-08 |
| 102 | 2 | 2025-01-06 | delivered | 2025-01-07 |
| 103 | 1 | 2025-01-15 | delivered | 2025-01-20 |
| 104 | 3 | 2025-01-18 | cancelled | NULL |
| 105 | 4 | 2025-01-22 | delivered | 2025-01-31 |
showing 5 of 33 rows
order_lines4 columns · 48 rows
| order_idinteger → sales_orders | item_idinteger → catalog_items | quantityinteger | unit_pricereal |
|---|---|---|---|
| 101 | 1 | 1 | 39 |
| 101 | 3 | 2 | 19.5 |
| 102 | 4 | 1 | 59 |
| 103 | 5 | 1 | 45 |
| 103 | 10 | 3 | 12 |
showing 5 of 48 rows
solution.sql
Hints and the answer are always available. Using them counts the question as solved with help.