La solicitud

De Brian Mitchell, Analista Financiero
Tu objetivo
Para los pedidos completados realizados en 2025 y las líneas con quantity > 0, devuelve una fila por mes con: month (primer día del mes, como DATE), net_revenue (suma de quantity * unit_price * (1 - discount_pct / 100.0) del mes, redondeada a 2) y ytd_revenue (total acumulado de los ingresos netos mensuales desde enero hasta ese mes, redondeado a 2). Ordena por month ascendente.
- Lee de la tabla
orderspendiente - Lee de la tabla
order_itemspendiente - Muestra exactamente
monthnet_revenueytd_revenuependiente
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 Brian, 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 |
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 |
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 |
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
Los agregados como SUM, AVG, COUNT, MIN y MAX también pueden usarse como funciones de ventana.
Con un ORDER BY dentro de OVER, se vuelven acumulativos:
SUM(net_revenue) OVER (ORDER BY month) AS ytd_revenue
Para cada mes, esto suma los ingresos de todos los meses hasta él, incluido: el acumulado de enero es enero, el de febrero es enero más febrero, y así sucesivamente. Las filas no se colapsan, así que obtienes el número mensual y el total acumulado lado a lado.
Primero agrega, luego la ventana
Los ingresos viven en las líneas de pedido, pero el total acumulado es sobre meses. Agrega a una fila por mes en una CTE y aplica la ventana encima. Si pones la ventana directamente sobre filas a nivel de línea, obtendrías un total acumulado por línea, que no es lo que nadie quiere en una diapositiva.
Marcos: qué significa “hasta la fila actual”
Toda ventana con ORDER BY tiene un marco: el conjunto de filas que la función ve para la fila actual.
El marco por defecto cuando escribes solo ORDER BY es:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
RANGE trata las filas con el mismo valor de ORDER BY como pares e incluye a todas. Con una fila por
mes eso no cambia nada. Pero si hicieras una suma acumulada sobre pedidos ordenados por fecha y dos
pedidos compartieran fecha, ambos mostrarían el mismo total acumulado, incluyéndose mutuamente. Eso
sorprende a la gente. Escribir el marco explícitamente con ROWS lo hace fila por fila:
SUM(net_revenue) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
Ser explícito no cuesta nada y documenta la intención. Este marco por defecto se aplica por igual en Postgres, DuckDB, MySQL 8, BigQuery y Snowflake.
Reiniciar el total
PARTITION BY reinicia el total acumulado por grupo. Para tener un acumulado del año que se reinicia cada
año con datos de varios años:
SUM(net_revenue) OVER (
PARTITION BY EXTRACT(YEAR FROM month)
ORDER BY month
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS ytd_revenue
O por canal, por categoría, por cliente: lo que el negocio siga por separado.
Participación sobre el total
La misma función con un OVER () vacío da el total general en cada fila, que es la forma estándar de
calcular la participación sobre el total sin una subconsulta:
ROUND(100.0 * net_revenue / SUM(net_revenue) OVER (), 1) AS pct_of_year
Errores comunes
- Olvidar el ORDER BY dentro de OVER:
SUM(x) OVER ()es el total general, no un total acumulado. - Confiar en el ORDER BY externo. El externo ordena la salida; solo el ORDER BY dentro de OVER define el orden de acumulación.
- Redondear los valores mensuales antes de sumarlos, lo que hace que el acumulado se desvíe unos centavos del total real.
En SQL Server
La ventana es la misma, pero escribe el marco completo: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
Con solo ORDER BY, el marco por defecto de SQL Server es RANGE, que allí es más lento y suma los meses
empatados en un solo paso. Reinicia por año con PARTITION BY YEAR(month).
¡Linterna encendida!
Practicaste: running totalsum overwindow framecte
- Resuelto
- Sin pistas
- Al primer intento
