1. Faro

Nivel 8 · Desafío final: una vista limpia de clientes

La solicitud

De Priya Shah, Directora de Datos

“Cada equipo limpia los clientes de forma distinta, así que sus números nunca coinciden. Construyamos una sola vista limpia de clientes y usémosla para tres informes: cuántas personas reales tenemos por segmento, ingresos por estado y qué fuentes de referencia se convierten en compradores.”

Tu objetivo

Paso 1 de 3. Devuelve una fila por segmento con: segment, raw_records (filas de clientes antes de deduplicar), people (filas conservadas por la regla de deduplicación) y states (número de estados limpios distintos entre las filas conservadas).

  • Lee de la tabla customerspendiente
  • Muestra exactamente segment raw_records people statespendiente
  • 2 filaspendiente

Paso 1 · 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.

    Paso 2 · 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.

      Paso 3 · 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
        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
        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
        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 limpieza rinde cuando una tabla limpia alimenta muchos informes. Este desafío final construye una vista limpia de clientes una sola vez, con todas las reglas del capítulo, y responde tres preguntas a partir de ella.

        La vista limpia de clientes

        Escribe las reglas antes del SQL:

        • Una persona es un email limpio, LOWER(TRIM(email)).
        • El registro que sobrevive es el alta más temprana, con empates resueltos por el customer_id más bajo.
        • El estado es UPPER(TRIM(state)). La fuente de referencia es COALESCE(referral_source, 'unknown').
        • Los ingresos vienen solo de pedidos completados y de líneas con cantidad positiva.
        WITH clean_customers AS (
          SELECT customer_id, UPPER(TRIM(state)) AS state
          FROM (
            SELECT *, ROW_NUMBER() OVER (
              PARTITION BY LOWER(TRIM(email)) ORDER BY signup_date, customer_id) AS rn
            FROM customers
          ) AS ranked
          WHERE rn = 1
        )

        Cada paso repite esta CTE. En el trabajo sería una vista guardada, y cada panel seleccionaría de ella.

        Paso 1: ¿cuánto cambió la limpieza?

        Antes de reportar, muestra el efecto de las reglas. De 1,732 filas de consumidores, 1,716 son personas distintas. De 286 filas de empresas, 284. Reportar esto junto a los números hace que la limpieza sea auditable.

        Paso 2: ingresos por estado limpio

        Agrega primero los ingresos por cliente y luego haz el join: una fila por cliente en ambos lados, así que no hay multiplicación de filas. Con los valores de estado en bruto, California aparecería como CA, ' CA', 'ca' y 'CA ', con 234, 2, 2 y 2 compradores. Tras limpiar es una sola fila, el estado top con 240 clientes compradores.

        Paso 3: ¿qué fuentes se convierten en compradores?

        people cuenta a todos en la vista limpia; buyers cuenta a los que tienen al menos un pedido completado. Un LEFT JOIN conserva a las personas que nunca compraron; COUNT(b.customer_id) se salta sus NULL. El grupo unknown sigue siendo el más grande con 648 personas, por debajo de las 666, porque los 18 registros duplicados no tenían fuente de referencia. NULLIF protege la división por si algún grupo quedara vacío.

        Errores comunes

        • Reglas inconsistentes entre pasos. Si el paso 2 usa el estado en bruto, su total ya no coincide con el del paso 1.
        • Unir pedidos antes de deduplicar. Aquí funciona solo porque los duplicados no tienen pedidos. Con datos reales, reasigna primero los ids descartados al id conservado.
        • INNER JOIN para compradores. Elimina a los que no compraron, así que todas las fuentes muestran 100%.

        En SQL Server

        La misma consulta funciona con ISNULL o COALESCE y TOP 10 en lugar de LIMIT 10 (SELECT TOP 10 c.state, ... ORDER BY net_revenue DESC). Guarda la CTE como una vista con CREATE VIEW clean_customers AS SELECT .... Una vista no puede contener el ORDER BY sin TOP.

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