La solicitud

De Brian Mitchell, Analista Financiero
Tu objetivo
Para los pedidos completados, calcula order_value como la suma de quantity * unit_price * (1 - discount_pct / 100.0) sobre las líneas con quantity > 0, y cuenta las líneas de cada pedido con quantity <= 0. Calcula un único límite superior sobre todos los pedidos completados: Q3 + 1.5 * (Q3 - Q1) de order_value, con Q1 y Q3 de quantile_cont en 0.25 y 0.75. Devuelve una fila por canal con: channel, orders (pedidos completados), high_value_orders (pedidos con order_value por encima del límite) y orders_with_bad_lines (pedidos con al menos una línea con quantity <= 0).
- Lee de la tabla
orderspendiente - Lee de la tabla
order_itemspendiente - Muestra exactamente
channelordershigh_value_ordersorders_with_bad_linespendiente
Tu consulta
Cargando el editor…
Solución de referencia
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Brian, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
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 |
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 |
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
Un valor atípico es un valor lejos del resto. Algunos son errores (una cantidad de -16), otros son reales e importantes (un cliente empresarial amueblando una oficina). Borrar ambos tipos oculta información, así que la práctica estándar es marcar primero y decidir después.
Marcas basadas en reglas
Algunos valores son imposibles por definición. Una cantidad vendida de cero o menos es un error de captura. En este conjunto de datos 24 líneas de pedido tienen una: 8 ceros y 16 negativos, de -1 a -16. Una marca por regla es una condición simple:
CASE WHEN quantity <= 0 THEN 1 ELSE 0 END AS bad_line
Deja esas líneas fuera de los ingresos, pero cuéntalas. 19 pedidos completados contienen una.
Marcas estadísticas: el límite IQR
Para valores posibles pero inusuales, compáralos con la distribución. El rango intercuartílico (IQR) es Q3 menos Q1, la dispersión de la mitad central de los datos. La regla de Tukey marca todo lo que está por encima de Q3 + 1.5 × IQR (y por debajo de Q1 − 1.5 × IQR, que para los valores de pedido queda por debajo de cero).
SELECT
quantile_cont(order_value, 0.25) AS q1,
quantile_cont(order_value, 0.75) AS q3
FROM order_values;
Para los 10,849 pedidos completados, Q1 es $93.99 y Q3 es $659.94, así que el límite queda en unos
$1,508.87. El pedido mediano es $268.96 y el mayor es $11,103.27. quantile_cont interpola entre valores;
quantile_disc devuelve un valor real de los datos.
Leer el resultado
926 pedidos completados, cerca del 8.5%, están por encima del límite. Es mucho para una regla de “valores atípicos”, y te dice algo: los valores de pedido están muy sesgados a la derecha, con muchos pedidos pequeños y una cola larga de grandes compras de muebles y de empresas. La regla del IQR se diseñó para datos más o menos simétricos. Esos pedidos son ingresos reales, que es exactamente por lo que los marcas en lugar de borrarlos. Finanzas podría pronosticarlos por separado o modelar el logaritmo del valor del pedido.
Errores comunes
- Borrar en lugar de marcar. No puedes deshacer un
WHEREdel que nunca informaste a nadie. - Recalcular el límite tras quitar los atípicos. El límite se mueve cada vez; calcúlalo una vez sobre todos los datos.
- Un límite por grupo por accidente. Decide si el umbral es global o por canal, y haz que la consulta lo diga.
- Media y desviación estándar con datos sesgados. Los pedidos grandes inflan ambas, así que una regla de “3 sigmas” se pierde lo que debería atrapar. Los cuartiles resisten eso.
En SQL Server
No hay quantile_cont. PERCENTILE_CONT es allí una función de ventana, así que repite el valor en cada
fila:
SELECT DISTINCT
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY order_value) OVER () AS q1,
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY order_value) OVER () AS q3
FROM order_values;
Postgres y Snowflake usan percentile_cont(0.75) WITHIN GROUP (ORDER BY order_value) como agregado.
¡Linterna encendida!
Practicaste: outliersiqrquantiledata qualityctedata cleaning
- Resuelto
- Sin pistas
- Al primer intento
