La solicitud

De Laura Bennett, Directora de Finanzas
Tu objetivo
Usando pedidos completados y líneas con quantity > 0, calcula los ingresos de por vida de cada cliente (suma de quantity * unit_price * (1 - discount_pct / 100.0)). Divide a los clientes en 4 grupos con NTILE(4), ordenados por ingresos de por vida descendentes (desempata por customer_id ascendente), de modo que el grupo 1 contenga a los que más gastan. Devuelve una fila por grupo con: spend_quartile, customers, min_revenue y max_revenue (los ingresos de por vida más bajo y más alto del grupo, redondeados a 2) y pct_of_revenue (los ingresos del grupo / ingresos totales * 100, redondeado a 1). Ordena por spend_quartile ascendente.
- Lee de la tabla
customerspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
spend_quartilecustomersmin_revenuemax_revenuepct_of_revenuependiente
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 Laura, 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
NTILE(n) divide filas ordenadas en n grupos de tamaño casi igual y devuelve el número de grupo. Es la
forma más rápida de construir cuartiles (4), quintiles (5) o deciles (10).
Repaso: grupos del mismo tamaño
SELECT product_id, name, unit_price,
NTILE(4) OVER (ORDER BY unit_price DESC, product_id) AS price_quartile
FROM products;
Los 120 productos se dividen exactamente, así que cada cuartil tiene 30. Cuando el conteo no se divide exactamente, los primeros grupos reciben una fila extra: los 1,730 clientes con un pedido completado se reparten en 433, 433, 432 y 432.
NTILE corta por número de filas, no por valor. Dos clientes con ingresos casi iguales pueden caer en
cuartiles distintos si el límite cae entre ellos, y los cuartiles cubren rangos de gasto muy distintos.
Ese es el sentido de las columnas de mínimo y máximo del ticket:
| spend_quartile | customers | min_revenue | max_revenue | pct_of_revenue |
|---|---|---|---|---|
| 1 | 433 | 3,067.95 | 184,730.27 | 78.6 |
| 2 | 433 | 1,182.90 | 3,054.89 | 14.2 |
| 3 | 432 | 454.97 | 1,182.74 | 5.7 |
| 4 | 432 | 8.79 | 453.95 | 1.4 |
El cuarto superior de clientes aporta casi cuatro quintos de los ingresos, y su rango es enorme: tres cuentas empresariales han gastado cada una más de $100,000, mientras que el cuartil empieza en unos $3,000. El cuarto inferior, 432 clientes, suma el 1.4% de los ingresos, un contexto útil antes de que alguien gaste dinero en reactivarlos.
Agrupar por el resultado de una ventana
La ventana se ejecuta primero en una CTE; solo entonces puedes hacer GROUP BY spend_quartile, porque el
resultado de una ventana no se puede agrupar en el mismo SELECT que lo calcula. La participación usa una
ventana encima de las sumas agrupadas, SUM(SUM(revenue)) OVER (), que ya has visto con conteos.
Errores comunes
- Orden ascendente.
ORDER BY revenueconvierte el cuartil 1 en los que menos gastan. Indica la dirección. - Sin desempate. Ingresos iguales en un límite pueden cambiar de grupo entre ejecuciones.
- Confundir NTILE con tramos por valor. Si finanzas quiere umbrales fijos ($500, $2,000), usa CASE.
En SQL Server
NTILE(4) OVER (ORDER BY revenue DESC, customer_id) es idéntico. El
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY revenue) OVER () de SQL Server da el valor en el límite en
lugar de un número de grupo.
¡Linterna encendida!
Practicaste: ntilequartilessum overcte
- Resuelto
- Sin pistas
- Al primer intento
