task Cohorts & retention · hard
Next-month retention by signup cohort
Group shoppers into cohorts by signup month. A shopper is retained if they placed a non-cancelled order in the calendar month after their signup month. Return cohort_month, cohort_size, retained and retention_pct.
what to return
- Columns
cohort_monthcohort_sizeretainedretention_pctin this order- Rows
- 2 rows · any order
- Watch for
- cohort_month is YYYY-MM; cohort_size counts every shopper who signed up that month, even those who never ordered.
- Only include cohorts whose following month ends on or before 2025-03-31 (later months aren't fully observed).
- retention_pct is 0–100 with 2 decimals.
- Skill
- Build a cohort retention table with a maturity rule. Refresher: Dates & monthly analysis →
expected result
Your query should return exactly these columns and values. Run it and compare.
expected result2 rows · any order
| cohort_month | cohort_size | retained | retention_pct |
|---|---|---|---|
| 2025-01 | 6 | 4 | 66.67 |
| 2025-02 | 4 | 3 | 75 |
all 2 rows
data you can query
Sample rows from each table. Each column shows its type underneath; → marks a link to another table.
shoppers5 columns · 17 rows
| idinteger · key | nametext | emailtext | regiontext | signup_datetext |
|---|---|---|---|---|
| 1 | Ana Ruiz | ana@harbor.test | West | 2025-01-03 |
| 2 | Ben Okafor | ben@harbor.test | East | 2025-01-05 |
| 3 | Chloe Park | chloe@harbor.test | West | 2025-01-09 |
| 4 | Dmitri Volkov | dmitri@harbor.test | North | 2025-01-14 |
| 5 | Esi Mensah | NULL | South | 2025-01-20 |
showing 5 of 17 rows
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
solution.sql
Hints and the answer are always available. Using them counts the question as solved with help.