La solicitud

De Priya Shah, Directora de Datos
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
segmentraw_recordspeoplestatespendiente - 2 filaspendiente
Paso 2 de 3. Usando la vista limpia de clientes, devuelve los 10 estados limpios con más ingresos: state (limpio), customers (clientes conservados en ese estado con al menos un pedido completado) y net_revenue (redondeado a 2). Ordena por net_revenue descendente.
- Lee de la tabla
customerspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
statecustomersnet_revenuependiente
Paso 3 de 3. Usando la vista limpia de clientes, devuelve una fila por fuente de referencia (NULL mostrado como 'unknown') con: referral_source, people (clientes conservados), buyers (de ellos, clientes con al menos un pedido completado) y buyer_pct (buyers / people * 100, redondeado a 1, con la división protegida por NULLIF). Ordena por people descendente y luego por referral_source.
- Lee de la tabla
customerspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
referral_sourcepeoplebuyersbuyer_pctpendiente
Paso 1 · 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.
Paso 2 · 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.
Paso 3 · 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 Priya, 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 |
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 |
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 |
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 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_idmás bajo. - El estado es
UPPER(TRIM(state)). La fuente de referencia esCOALESCE(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.
¡Linterna encendida!
Practicaste: data cleaningdeduplicationrow numbercoalescenulliftrimcte
- Resuelto
- Sin pistas
- Al primer intento
