La solicitud

De Megan Collins, Directora de Ventas
Tu objetivo
Corrige la consulta. Para cada pedido completado, encuentra la fecha del siguiente pedido completado del mismo cliente (pedidos ordenados por order_date, desempatando por order_id). Devuelve una fila por segment (de customers) con: segment, reorders (pedidos completados que tienen un siguiente pedido completado del mismo cliente) y avg_days_to_next (promedio de días entre las fechas calendario de un pedido y el siguiente del cliente, redondeado a 1).
- Lee de la tabla
customerspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
segmentreordersavg_days_to_nextpendiente
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 Megan, 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 |
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 |
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 |
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
LAG mira la fila anterior y LEAD la siguiente. Ambos solo tienen sentido cuando “anterior” y “siguiente” se quedan dentro del grupo correcto.
Detectar el fallo
Ejecuta la CTE gaps por sí sola y mira unas cuantas filas en orden: las filas vecinas pertenecen a
clientes distintos. Sin PARTITION BY, la ventana es toda la tabla ordenada por tiempo, así que LEAD
devuelve la fecha del siguiente pedido que hizo cualquiera. Con unos 10,800 pedidos completados a lo largo
de tres años, eso suele ser el mismo día, de ahí el promedio de 0.1 días.
Dos señales lo delatan: un intervalo físicamente implausible y un conteo de “tiene un siguiente pedido” que es casi todos los pedidos. Solo un pedido de toda la tabla no tiene sucesor en la ventana del starter, mientras que en la realidad el último pedido de cada cliente no tiene ninguno.
LAG y LEAD juntos
SELECT order_id,
CAST(order_date AS DATE) AS order_day,
LAG(CAST(order_date AS DATE)) OVER w AS prev_day,
LEAD(CAST(order_date AS DATE)) OVER w AS next_day
FROM orders
WHERE status = 'completed' AND customer_id = 125
WINDOW w AS (PARTITION BY customer_id ORDER BY order_date, order_id);
Para el cliente 125 esto lista ocho pedidos completados, del 2023-01-01 al 2025-04-20. Los intervalos van de 2 días (del 30 de noviembre al 2 de diciembre de 2024, en torno al Black Friday) a casi 11 meses, por eso un promedio sobre muchos clientes es más útil que cualquier intervalo suelto. Revisar a un cliente así, con la partición en su sitio, es la forma más rápida de ver si una ventana se comporta bien antes de agregarla.
Misma ventana, dos direcciones: LAG responde “cuánto tiempo desde el último pedido”, LEAD “cuánto hasta el
siguiente”. La cláusula WINDOW con nombre evita repetir la definición. En el primer pedido prev_day es
NULL, en el último next_day es NULL.
Errores comunes
- Sin PARTITION BY en una ventana por entidad.
- Restar marcas de tiempo en lugar de fechas: obtienes un intervalo con horas, no días completos.
- Filtrar el periodo antes de la ventana. Restringir primero a 2025 oculta un pedido de diciembre de 2024 que era el verdadero pedido anterior de un cliente.
En SQL Server
LEAD y LAG se escriben igual. Para diferencias de días usa DATEDIFF(day, order_day, next_order_day);
restar dos fechas directamente no funciona allí. La cláusula WINDOW solo existe desde SQL Server 2022.
¡Linterna encendida!
Practicaste: leadlagpartition bydebuggingdate difference
- Resuelto
- Sin pistas
- Al primer intento
