La solicitud

De Catherine Hale, Directora General
Tu objetivo
Usando pedidos registrados (status IN ('completed', 'refunded')) y la CTE firsts del código inicial, devuelve una fila por cohorte para primeros pedidos anteriores a 2025-01-01 con las columnas cohort (DATE, el inicio del trimestre de date_trunc('quarter', first_at)), customers, repeat_90_pct y repeat_365_pct: la proporción de la cohorte con otro pedido registrado posterior al primero y a no más de 90 (o 365) días de él (order_date <= first_at + INTERVAL 90 DAY), por 100 y redondeada a 1. Ordena por cohort.
- Lee de la tabla
customerspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
cohortcustomersrepeat_90_pctrepeat_365_pctpendiente
Tu consulta
Cargando el editor…
Solución de referencia
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Catherine, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NULL |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NULL |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NULL |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NULL |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NULL |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NULL | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NULL | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NULL | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
La retención necesita una ventana
“¿Qué proporción de clientes volvió?” no tiene respuesta hasta que dices en cuánto tiempo. Dale a un cliente tres años y casi todos en Harbor & Pine vuelven a pedir; dale una semana y casi nadie lo hace. Una tabla de retención por cohortes fija la ventana y mide cada cohorte con ella: “recompra en 90 días desde el primer pedido”, “recompra en 365 días”.
La ventana se cuenta desde el primer pedido de cada cliente, no desde el inicio del trimestre. Un cliente que compró por primera vez el 30 de marzo y otro que lo hizo el 2 de enero tienen exactamente 90 días cada uno.
Una bandera por cliente
Une los pedidos registrados posteriores de cada cliente con su primer pedido, y convierte “¿hay alguno dentro de la ventana?” en una bandera 0/1:
MAX(CASE WHEN b.order_date <= f.first_at + INTERVAL 90 DAY THEN 1 ELSE 0 END) AS r90
MAX reduce muchos pedidos posteriores a una bandera por cliente: un cliente con cinco pedidos de
recompra sigue contando una vez. El join debe ser un LEFT JOIN con b.order_date > f.first_at en
la cláusula ON, para que quienes compraron una sola vez permanezcan en la tabla con bandera 0. Si
pones esa condición en WHERE, desaparecen del denominador y la retención se dispara.
Luego la tasa de la cohorte es el promedio de las banderas: SUM(r90) * 100.0 / COUNT(*).
Solo ventanas justas
Una ventana de 365 días solo tiene sentido para clientes que han tenido 365 días. Quien hizo su primer pedido en 2025 no los ha tenido, así que sus recompras ausentes no son un veredicto, solo falta de tiempo. Por eso esta tabla se detiene en los primeros pedidos anteriores a 2025-01-01. Esto se llama censura por la derecha: el resultado lo corta el final de los datos, no el cliente.
Leer la tabla
Lee una columna hacia abajo para ver si las cohortes nuevas se comportan como las antiguas. Lee una fila hacia la derecha para ver cómo se acumula la retención con una ventana más larga. Compara las cohortes de fiestas con las de fiestas: los compradores de regalos de noviembre se comportan distinto de los clientes que descubrieron la tienda en primavera.
Cuidado con la primera cohorte de cualquier conjunto de datos. Si los datos empiezan en enero de 2023, la “cohorte 2023Q1” incluye en parte a clientes que ya eran leales antes de que empiecen los datos. Aquí son 116 de 177 personas, y por eso esa fila se ve tan bien.
Errores comunes
- Sin ventana. “Alguna vez volvió” premia a las cohortes antiguas por ser antiguas.
- WHERE en vez de ON. Filtrar los pedidos posteriores en
WHEREelimina a quienes compraron una sola vez. - Contar pedidos en vez de clientes.
COUNT(b.order_id)mide cuánto compran los que repiten, no cuántos volvieron.
¡Linterna encendida!
Practicaste: cohortretentionrepeat purchasectedate arithmetic
- Resuelto
- Sin pistas
- Al primer intento
