La solicitud

De Daniel Foster, Gerente de Producto Móvil
Tu objetivo
A partir de web_sessions iniciadas en 2025 (started_at desde 2025-01-01 hasta 2026-01-01, sin incluirlo), devuelve una fila por dispositivo con: device, sessions (todas las sesiones), engaged_sessions (sesiones con pages_viewed >= 3), converted_sessions (sesiones donde converted es verdadero), engaged_pct (engaged_sessions / sessions * 100, redondeado a 1), engaged_to_converted_pct (converted_sessions / engaged_sessions * 100, redondeado a 1) y overall_conversion_pct (converted_sessions / sessions * 100, redondeado a 2). Ordena por sessions descendente.
- Lee de la tabla
web_sessionspendiente - Muestra exactamente
devicesessionsengaged_sessionsconverted_sessionsengaged_pctengaged_to_converted_pctoverall_conversion_pctpendiente - 3 filas, ordenadas como se pidependiente
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 Daniel, 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 |
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 |
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 embudo sigue a las personas a través de una secuencia de pasos y cuenta cuántas sobreviven a cada uno. Los equipos de producto lo usan para encontrar el paso que más gente pierde, porque ahí es donde un arreglo da fruto.
Etapas como conteos condicionales
Cuando cada etapa es una condición sobre la misma fila, un embudo es un solo GROUP BY con un conteo por
etapa:
SELECT
device,
COUNT(*) AS sessions,
COUNT(*) FILTER (WHERE pages_viewed >= 3) AS engaged_sessions,
COUNT(*) FILTER (WHERE converted) AS converted_sessions
FROM web_sessions
GROUP BY device;
FILTER (WHERE ...) cuenta solo las filas que coinciden. Funciona en DuckDB y Postgres;
SUM(CASE WHEN pages_viewed >= 3 THEN 1 ELSE 0 END) hace lo mismo en todas partes.
Comprueba que las etapas se anidan
Un embudo solo tiene sentido si cada etapa es un subconjunto de la anterior. En Harbor & Pine toda sesión
convertida vio al menos 3 páginas, lo que puedes confirmar con
COUNT(*) FILTER (WHERE converted AND pages_viewed < 3): devuelve 0. Si no fuera así, una “tasa de paso”
podría superar el 100% y el embudo estaría mintiendo.
Ejemplo resuelto: 2025 por dispositivo
| device | sessions | engaged | converted | engaged % | engaged → converted % | overall % |
|---|---|---|---|---|---|---|
| mobile | 9,407 | 4,195 | 237 | 44.6 | 5.6 | 2.52 |
| desktop | 5,252 | 2,311 | 217 | 44.0 | 9.4 | 4.13 |
| tablet | 1,566 | 707 | 46 | 45.1 | 6.5 | 2.94 |
La tasa total por sí sola dice “el móvil convierte peor”. Los pasos dicen dónde: los visitantes de móvil interactúan tanto como los de escritorio y luego caen en el último paso. Eso apunta al equipo de producto hacia el pago en móvil, no hacia las páginas de aterrizaje.
Dos tipos de tasa
- Conversión por paso: esta etapa dividida entre la anterior. Localiza la fuga.
- Conversión total: la última etapa dividida entre la primera. Es la cifra principal.
Indica cuál reportas. “La conversión es 9.4%” y “la conversión es 4.13%” son ciertas para escritorio.
Errores comunes
- División entera. En Postgres y SQL Server,
237 / 9407es 0. Multiplica primero por100.0. - Contar la unidad equivocada. Estas son tasas de sesión. Un embudo a nivel de cliente cuenta clientes distintos por etapa y da números diferentes.
- Etapas que no se anidan, como se describió arriba.
En SQL Server
No hay cláusula FILTER y converted sería un BIT, así que usa CASE:
SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) AS converted_sessions,
ROUND(100.0 * SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) / COUNT(*), 2)
AS overall_conversion_pct -- 100.0, not 100 ¡Linterna encendida!
Practicaste: funnelconversion rateconditional aggregationfilter clause
- Resuelto
- Sin pistas
- Al primer intento
