1. Faro

Nivel 9 · Depura: todos son clientes nuevos

La solicitud

De Brian Mitchell, Analista de Finanzas

“Esta consulta dice que ganamos 253 clientes empresariales nuevos en 2025. En total solo tenemos 286 clientes empresariales, y la mayoría compra desde hace años. Los números se ven raros. ¿Puedes arreglarlo?”

Tu objetivo

Arregla la consulta. Un cliente es nuevo en 2025 cuando su primer pedido completado de todos los tiempos se hizo en 2025. Devuelve una fila por segmento (desde customers) con: segment y new_customers (número de clientes nuevos en 2025).

  • Lee de la tabla customerspendiente
  • Lee de la tabla orderspendiente
  • Muestra exactamente segment new_customerspendiente

Tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de customers · presiona Ejecutar para ver el tuyo
    Vista previa de customers
    customer_idfirst_namelast_nameemailcity
    1OwenHudsonowen.hudson@icloud.comSan Francisco
    2DouglasMendozadmendoza69@gmail.comAtlanta
    3HenryBrookshbrooks@lakesidecafe.comLos Angeles
    4BrianGrahambgraham@bluecedarhomes.comSeattle

    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.

    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
    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
    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

    El orden de las operaciones dentro de una consulta decide qué puede ver un agregado. WHERE se ejecuta antes que GROUP BY, así que un filtro en el CTE cambia sobre qué se calcula MIN.

    Detectar el error

    Una comprobación de sentido común lo expone rápido: el código inicial afirma 253 clientes empresariales nuevos en 2025, mientras que toda la tabla tiene 286 clientes empresariales, y 192 de ellos se registraron antes de 2025. No pueden ser casi todos nuevos en el mismo año. Siempre que un conteo de “nuevos” se acerque a la población total, sospecha de la definición antes de celebrar el resultado.

    Pregunta qué significa una fila del CTE. Con el filtro de 2025, first_order_date es “primer pedido completado en 2025”, no “primer pedido completado de todos los tiempos”. Todo cliente que compró en 2025 tiene uno, así que la consulta externa cuenta a todos los compradores de 2025.

    La solución: agrega sobre el historial completo, filtra después

    WITH first_orders AS (
      SELECT customer_id, MIN(order_date) AS first_order_date
      FROM orders
      WHERE status = 'completed'
      GROUP BY customer_id
    )
    SELECT COUNT(*) AS new_in_2025
    FROM first_orders
    WHERE first_order_date >= '2025-01-01'
      AND first_order_date < '2026-01-01';

    Esto devuelve 635 clientes cuyo primer pedido completado de todos los tiempos fue en 2025, frente a 1,447 clientes que compraron en 2025 en total. El filtro de estado se queda dentro del CTE: un pedido cancelado no es una compra, así que no debe contar como el primero de nadie.

    El mismo razonamiento se aplica a cualquier medida de “primero” o “último”: primer producto comprado, primer cupón usado, fecha del último pedido antes del abandono. Cada una se calcula sobre todo el historial.

    Una regla útil: los filtros que definen qué cuenta (pedidos completados) van antes del agregado. Los filtros que definen qué filas de resultado reportas (la ventana de 2025) van después.

    Errores comunes

    • Mover el filtro de fecha a HAVING MIN(order_date) >= '2025-01-01'. Eso también funciona, porque HAVING se ejecuta después de agrupar; solo no lo dejes en WHERE.
    • Quitar el filtro de estado junto con el filtro de fecha. Un cliente cuyo primer pedido fue cancelado en 2024 y que luego compró en 2025 es nuevo en 2025.

    En SQL Server

    El mismo CTE funciona. Para comparar por la fecha de calendario de una columna datetime2, usa CAST(first_order_date AS date) o conserva el rango semiabierto >= '20250101' AND < '20260101', que es correcto a cualquier hora del día.

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