1. Faro

Nivel 6 · Una cuadrícula de retención por cohortes

La solicitud

De Priya Shah, Directora de Datos

“La retención del mes 1 del trimestre pasado generó más preguntas que respuestas. Construye la cuadrícula completa para las cohortes de enero a junio de 2025: meses 0 a 3 después del primer pedido, en formato largo, y yo la pivoto en la presentación.”

Tu objetivo

Usando solo pedidos completados, asigna cada cliente a cohort_month = el mes (primer día, como DATE) de su primer pedido completado. Un cliente está activo en un mes si tiene al menos un pedido completado en él. Para las cohortes de 2025-01-01 a 2025-06-01, devuelve una fila por cohorte y month_offset 0, 1, 2 y 3 (month_offset = meses calendario completos entre cohort_month y el mes activo) con: cohort_month, month_offset, active_customers (clientes de la cohorte activos en ese mes) y retention_pct (active_customers / número de clientes de la cohorte * 100, redondeado a 1). Ordena por cohort_month y luego por month_offset.

  • Lee de la tabla orderspendiente
  • Muestra exactamente cohort_month month_offset active_customers retention_pctpendiente
  • 24 filas, ordenadas como se pidependiente

Tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de orders · presiona Ejecutar para ver el tuyo
    Vista previa de orders
    order_idcustomer_idorder_datestatuschannel
    10011252023-01-01 20:51:19completedweb
    10021562023-01-02 07:58:46completedweb
    1003222023-01-02 10:25:27completedmarketplace
    1004482023-01-02 11:21:51completedmarketplace

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    Tablas

    Datos de la tienda Harbor & Pine, listos para consultar.

    orders12,000 filas · 7 columnas
    • order_idinteger
    • customer_idinteger
    • order_datetimestamp
    • statusvarchar
    • channelvarchar
    • shipping_feedecimal
    • coupon_codevarchar
    Primeras 5 filas de orders
    order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
    10011252023-01-01 20:51:19completedweb0.00NULL
    10021562023-01-02 07:58:46completedweb0.00NULL
    1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
    1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
    1005822023-01-02 11:43:36completedweb0.00WELCOME10
    customers2,018 filas · 9 columnas
    • customer_idinteger
    • first_namevarchar
    • last_namevarchar
    • emailvarchar
    • cityvarchar
    • statevarchar
    • signup_datedate
    • segmentvarchar
    • referral_sourcevarchar
    Primeras 5 filas de customers
    customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
    1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
    2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNULL
    3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNULL
    4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
    5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNULL
    products120 filas · 8 columnas
    • product_idinteger
    • namevarchar
    • categoryvarchar
    • subcategoryvarchar
    • unit_pricedecimal
    • unit_costdecimal
    • launched_ondate
    • is_activeboolean
    Primeras 5 filas de products
    product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
    101Vale Velvet LoveseatFurnitureSofas1659.00NULL2023-09-11true
    102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
    103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
    104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
    105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
    order_items30,338 filas · 6 columnas
    • order_item_idinteger
    • order_idinteger
    • product_idinteger
    • quantityinteger
    • unit_pricedecimal
    • discount_pctdecimal
    Primeras 5 filas de order_items
    order_item_idorder_idproduct_idquantityunit_pricediscount_pct
    11001121931.990.00
    21001154311.990.00
    31002154411.990.00
    410021941149.000.00
    51002193219.990.00
    returns1,673 filas · 5 columnas
    • return_idinteger
    • order_item_idinteger
    • returned_ondate
    • reasonvarchar
    • refund_amountdecimal
    Primeras 5 filas de returns
    return_idorder_item_idreturned_onreasonrefund_amount
    1142023-01-10damaged83.69
    2422023-01-10wrong_item19.99
    31052023-01-14wrong_item10.99
    4242023-01-16changed_mind26.99
    51262023-01-16late20.99
    employees60 filas · 8 columnas
    • employee_idinteger
    • first_namevarchar
    • last_namevarchar
    • departmentvarchar
    • titlevarchar
    • manager_idinteger
    • hire_datedate
    • salaryinteger
    Primeras 5 filas de employees
    employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
    1CatherineHaleExecutiveChief Executive OfficerNULL2016-03-01285000
    2RobertKimExecutiveChief Operating Officer12017-01-09235000
    3MeganCollinsSalesHead of Sales12018-04-16172000
    4ChloeGutierrezSalesAccount Executive32020-01-2172000
    5FrankBellSalesAccount Executive32023-05-2173000
    web_sessions40,000 filas · 7 columnas
    • session_idinteger
    • customer_idinteger
    • started_attimestamp
    • devicevarchar
    • sourcevarchar
    • pages_viewedinteger
    • convertedboolean
    Primeras 5 filas de web_sessions
    session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
    1NULL2023-01-01 23:02:24mobilepaid1false
    2182023-01-01 15:07:49desktoppaid1false
    3NULL2023-01-01 16:55:46desktopdirect7false
    4NULL2023-01-01 12:43:28mobileorganic3false
    5NULL2023-01-01 13:06:21mobilesocial2false
    marketing_spend3,276 filas · 3 columnas
    • spend_datedate
    • channelvarchar
    • amountdecimal
    Primeras 5 filas de marketing_spend
    spend_datechannelamount
    2023-01-01paid492.99
    2023-01-01email37.38
    2023-01-01social200.53
    2023-01-02paid709.13
    2023-01-02email64.13

    La lección

    La retención del mes 1 que calculaste en el desafío final de funciones de ventana es una columna de un panorama mayor. Una cuadrícula de retención muestra, para cada cohorte, cuántos clientes estaban activos 0, 1, 2, 3 meses después de su primer pedido. Leer una columna hacia abajo compara cohortes; leer una fila de lado a lado muestra cómo decae una cohorte.

    Desfases de mes

    La columna clave de la cuadrícula es el desfase: cuántos meses calendario separan un mes activo del mes de la cohorte. DATEDIFF('month', start, end) cuenta los límites de mes cruzados, así que DATEDIFF('month', DATE '2025-01-01', DATE '2025-03-01') es 2. Como ambas fechas son el primer día del mes, eso es exactamente “dos meses después”.

    DATEDIFF('month', cohort_month, order_month) AS month_offset

    El desfase 0 es el propio mes de la cohorte. Todo cliente de la cohorte está activo ahí por definición, lo que hace que el conteo del desfase 0 sea el tamaño de la cohorte.

    Primero formato largo

    SQL es bueno con tablas largas (una fila por cohorte y desfase) y torpe con las anchas. Produce la cuadrícula larga y luego pivótala en una hoja de cálculo o en una herramienta de BI. Si tienes que pivotar en SQL, la agregación condicional lo hace: COUNT(*) FILTER (WHERE month_offset = 1) AS m1.

    Ejemplo resuelto: las dos primeras cohortes de 2025

    cohort_month month_offset active_customers retention_pct
    2025-01-01 0 37 100.0
    2025-01-01 1 4 10.8
    2025-01-01 2 3 8.1
    2025-01-01 3 4 10.8
    2025-02-01 0 28 100.0
    2025-02-01 3 7 25.0

    Dos cosas que notar. La retención puede subir entre desfases: esta cuadrícula pregunta “activo en ese mes”, no “volvió al menos una vez para entonces”, así que un cliente puede saltarse el mes 2 y volver en el mes 3. Y estas cohortes son pequeñas (de 28 a 52 clientes en el primer semestre de 2025, porque la mayoría de los clientes de Harbor & Pine hicieron su primer pedido antes), así que un solo cliente mueve una celda entre 2 y 4 puntos.

    Elegir el rango de cohortes

    El desfase 3 de la cohorte de junio de 2025 es septiembre de 2025, que está completo. Una cohorte de noviembre de 2025 aún no tiene mes 3; incluirla mostraría celdas vacías o engañosamente bajas. Muestra solo los desfases que ya han ocurrido por completo.

    Errores comunes

    • Contar pedidos, no clientes. Deduplica primero a cliente-mes.
    • Filtrar antes de la ventana de cohortes. Halla el primer pedido sobre todo el historial y luego filtra las cohortes.
    • Ceros ausentes. Una cohorte sin clientes activos en cierto desfase no tiene ninguna fila. Para una cuadrícula completa, haz un cross join de las cohortes con los desfases 0 a 3 y un LEFT JOIN con los conteos.

    En SQL Server

    DATEDIFF(month, cohort_month, order_month) cuenta límites de mes exactamente igual que DuckDB. Construye los inicios de mes con DATEFROMPARTS(YEAR(order_date), MONTH(order_date), 1), y el mes siguiente con DATEADD(month, 1, cohort_month).

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.