La solicitud

De Kevin Brooks, Gerente de Operaciones
Tu objetivo
A partir de orders (todos los estados), cuenta los pedidos por día calendario para cada día. Devuelve solo los días de diciembre de 2025 con: order_day (un DATE), orders (el conteo de ese día) y orders_7d_avg (el promedio de pedidos diarios de ese día y los 6 días anteriores, redondeado a 1; los primeros días de diciembre usan finales de noviembre en su ventana). Ordena por order_day ascendente.
- Lee de la tabla
orderspendiente - Muestra exactamente
order_dayordersorders_7d_avgpendiente - 31 filas, ordenadas como se pidependiente
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 Kevin, 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 |
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 |
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
Una media móvil suaviza números diarios ruidosos promediando cada día con sus vecinos. Las oscilaciones por día de la semana y los picos aislados se aplanan, y la tendencia se hace visible. Los equipos de operaciones, marketing y producto usan promedios de 7 días constantemente, porque una ventana de 7 días siempre contiene exactamente uno de cada día de la semana.
La cláusula de marco
Un marco de ventana dice exactamente qué filas alrededor de la actual debe ver la función:
AVG(orders) OVER (
ORDER BY order_day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS orders_7d_avg
6 PRECEDING AND CURRENT ROW son siete filas: hoy y las seis anteriores. Otros marcos que usarás:
| marco | significado |
|---|---|
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW |
total acumulado o promedio acumulado |
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING |
ventana centrada de 7 filas |
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING |
toda la partición |
Calcula antes de filtrar
Kevin quiere solo diciembre, pero el promedio del 1 de diciembre necesita del 25 al 30 de noviembre. Si
filtraras primero la CTE daily a diciembre, la ventana no tendría nada antes del 1 de diciembre, y los
primeros seis días serían promedios de 1 a 6 días en lugar de 7. Igual que con LAG, calcula la ventana
sobre todos los datos y luego filtra en la consulta externa.
Cuando sí reportes los primeros días de una serie sin datos anteriores, son promedios de menos de siete
días. O los descartas, o cuentas las filas del marco (COUNT(*) OVER (same window)) y muestras NULL
cuando son menos de 7.
ROWS cuenta filas, no días
6 PRECEDING significa seis filas atrás. Si un día tuvo cero pedidos, no tiene fila en daily, y la
ventana llega sin avisar ocho días calendario atrás. Harbor & Pine tiene pedidos todos los días, así que
aquí no hay problema. Con datos dispersos (un producto, una ciudad), genera un calendario completo y haz
un LEFT JOIN sobre él con COALESCE(orders, 0) antes de aplicar la ventana.
Postgres 11+, DuckDB y MySQL 8 también permiten un marco RANGE con un intervalo, que usa los valores en lugar de las posiciones de fila:
AVG(orders) OVER (
ORDER BY order_day
RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW
)
Postgres escribe INTERVAL '6 days'. BigQuery solo permite RANGE sobre números, así que ordenas por
UNIX_DATE(order_day) y escribes RANGE BETWEEN 6 PRECEDING AND CURRENT ROW. Esto maneja los huecos en
las fechas, pero un día faltante sigue sin contar como cero en el promedio: simplemente está ausente. El
join con un calendario es la única forma de promediar ceros reales.
Suma móvil vs media móvil
Una suma móvil de 7 días (SUM(orders) OVER (... 6 PRECEDING ...)) responde “pedidos de los últimos 7
días”, la base de métricas como los usuarios activos semanales calculados a diario. El marco es el mismo;
solo cambia la función.
Errores comunes
- Escribir
RANGE 6 PRECEDINGsobre una columna de fecha sin un intervalo, lo que da error o significa algo distinto según el dialecto. - Usar
ROWS BETWEEN 7 PRECEDING AND CURRENT ROW, que son 8 días. - Filtrar antes de la ventana, como arriba.
En SQL Server
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW funciona igual. SQL Server no admite un marco RANGE con un
intervalo (RANGE BETWEEN INTERVAL 6 DAY PRECEDING ...), así que rellena los días faltantes desde una
tabla de calendario y usa ROWS.
¡Linterna encendida!
Practicaste: moving averagewindow framerows betweenavg over
- Resuelto
- Sin pistas
- Al primer intento
