The Loyal Customers
The loyalty team at UrbanHop is choosing who gets an invitation to the beta of a subscription product, and the shortlist is ordered by how much each rider has actually spent with the platform. A booking a rider cancelled cost them nothing, so it says nothing about their value and must not count towards the figure.
The list is read by a human, so it needs names rather than rider numbers, and money to two decimal places. A rider who has never completed a booking has spent nothing and is not on the list.
rides — one row per booking. rider_id points at a row in riders and driver_id at a row in drivers. distance_km is the trip length in kilometres and fare the price in dollars; both are recorded when the booking is made, so a booking that never happened still carries them. status is either completed or cancelled. ride_date is the day the ride was booked for.
| id | rider_id | driver_id | distance_km | fare | ride_date | status |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 5.2 | 12.5 | 2023-06-01 | completed |
| 2 | 1 | 4 | 3.0 | 8.0 | 2023-06-03 | completed |
| 3 | 2 | 2 | 10.0 | 22.0 | 2023-06-02 | completed |
| 4 | 3 | 1 | 2.1 | 6.5 | 2023-06-05 | cancelled |
| 5 | 3 | 4 | 4.4 | 11.0 | 2023-06-06 | completed |
| 6 | 4 | 3 | 7.8 | 18.0 | 2023-06-04 | completed |
| 7 | 5 | 2 | 1.5 | 5.0 | 2023-06-07 | cancelled |
| 8 | 2 | 2 | 12.3 | 26.5 | 2023-06-10 | completed |
| 9 | 1 | 1 | 6.6 | 15.0 | 2023-06-12 | completed |
| 10 | 4 | 3 | 3.3 | 9.0 | 2023-06-15 | completed |
| 11 | 5 | 2 | 8.8 | 19.5 | 2023-06-18 | completed |
| 12 | 3 | 4 | 2.9 | 7.5 | 2023-06-20 | cancelled |
riders — one row per registered passenger. city is the city they signed up in and signup_date the day they joined.
| id | name | city | signup_date |
|---|---|---|---|
| 1 | Maya Chen | Austin | 2023-01-05 |
| 2 | Noah Patel | Denver | 2023-02-14 |
| 3 | Zara Ahmed | Austin | 2023-03-01 |
| 4 | Leo Kim | Seattle | 2023-04-20 |
| 5 | Ivy Brooks | Denver | 2023-05-11 |
Both tables already exist in the database — there is nothing to create or load.
Task: Write a query that returns one row per rider with at least one completed booking, with their name and their total spend on completed bookings, rounded to two decimal places, as total_spend. Highest spend first; riders on the same figure are separated alphabetically by name.
Example output
Shape only — these riders and figures are invented:
| name | total_spend |
|---|---|
| Elena Ford | 152.75 |
| Hugo Marsh | 98 |
| Cleo Barnes | 61.5 |
| Wren Adler | 40.25 |
| Ola Diaz | 12 |
Sign in to solve this problem
Reading problems is free for everyone — solving them (Run, Submit, and tracking what you've solved) needs an account.
Sign in