La solicitud

De Jordan Reyes, Directora de Marketing
Tu objetivo
Paso 1 de 3. Para 2025, devuelve una fila por source y device con: source, device, sessions, conversions y conversion_rate_pct (conversions * 100 / sessions, redondeado a 2). Ordena por source y luego por device, ascendente.
- Lee de la tabla
web_sessionspendiente - Muestra exactamente
sourcedevicesessionsconversionsconversion_rate_pctpendiente - 15 filas, ordenadas como se pidependiente
Paso 2 de 3. Para cada año 2023–2025 y cada canal de marketing_spend (email, paid, social), devuelve: year, channel, spend (total de amount, redondeado a 2), conversions (sesiones convertidas cuya source es igual al canal, mismo año de started_at) y cost_per_conversion (spend / conversions, redondeado a 2). Ordena por año y luego por canal.
- Lee de la tabla
web_sessionspendiente - Lee de la tabla
marketing_spendpendiente - Muestra exactamente
yearchannelspendconversionscost_per_conversionpendiente
Paso 3 de 3. Para 2025, devuelve una fila por source con: source, sessions, engaged (sesiones con pages_viewed >= 3), conversions, engaged_pct (engaged * 100 / sessions) y engaged_conv_pct (conversions * 100 / engaged), ambas redondeadas a 2. Ordena por engaged_conv_pct descendente.
- Lee de la tabla
web_sessionspendiente - Muestra exactamente
sourcesessionsengagedconversionsengaged_pctengaged_conv_pctpendiente - 5 filas, ordenadas como se pidependiente
Paso 1 · tu consulta
Cargando el editor…
Solución de referencia
| session_id | customer_id | started_at | device | source |
|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic |
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
| session_id | customer_id | started_at | device | source |
|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic |
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
| session_id | customer_id | started_at | device | source |
|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Jordan, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
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 |
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 |
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 |
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 |
La lección
Qué necesita el informe
El paquete de presupuesto de Marketing tiene tres tablas, y cada una usa una técnica distinta de este capítulo:
- Conversión por fuente y dispositivo (2025): un GROUP BY con dos columnas.
- Costo por conversión por año y canal de pago: dos tablas, cada una agregada por su cuenta, y luego unidas.
- Embudo por fuente (2025): dos etapas por fuente con tasas por paso.
Agrega antes de unir
marketing_spend tiene una fila por día y canal. web_sessions tiene una fila por visita. Si las unes
por canal y año, cada fila de gasto se repite una vez por cada sesión coincidente: el gasto de paid de
2025 pasa de $340,778 a $1.2 mil millones de la nada.
La solución es llevar cada tabla a la granularidad de la respuesta antes, una fila por año y canal, en su propia CTE:
WITH spend AS (SELECT year(spend_date) AS year, channel, SUM(amount) AS spend FROM marketing_spend GROUP BY 1, 2),
conv AS (SELECT year(started_at) AS year, source, COUNT(*) FILTER (WHERE converted) AS conversions FROM web_sessions GROUP BY 1, 2)
Ahora el join es uno a uno y nada se cuenta dos veces. Organic y direct no tienen gasto, así que un
inner join desde spend los descarta, que es lo que debe hacer una tabla de costos.
Tasas por paso según la fuente
Para la tabla de embudo, cuenta las sesiones con interacción y las conversiones por fuente en una sola
pasada, y divide cada etapa entre la etapa anterior. engaged_pct muestra qué tan bien los visitantes
de una fuente pasan de la página de aterrizaje; engaged_conv_pct muestra si los que exploran llegan
a comprar. Ordenar por la segunda deja arriba a las fuentes cuyos visitantes con interacción compran.
Salvedades para el paquete
- Las conversiones son sesiones convertidas de último contacto, no pedidos. Los pedidos de la app y del marketplace no están en los datos de sesiones.
- Solo los clientes conocidos pueden convertir aquí, así que las fuentes con muchos visitantes anónimos se ven más débiles.
- Faltan doce filas de día/canal en
marketing_spendpor caídas del seguimiento, así que algunos totales anuales están ligeramente bajos.
Errores comunes
- Sumar el gasto después de un join con las sesiones.
- Dividir las conversiones entre todas las sesiones en la tasa del paso, lo que repite la tasa global.
- Filtrar 2025 con
year() = 2025en una tabla y con un rango de fechas en la otra y obtener ventanas distintas. Usa la misma regla en ambos lados.
¡Linterna encendida!
Practicaste: funnelconversion ratecost per conversionpre aggregatectedrop off
- Resuelto
- Sin pistas
- Al primer intento
