df-drills pandas · Polars · DuckDB SQL · DuckDB Relational 题目列表 登录

同比

中等 15-window-offset 窗口:位移 yoycalendar-alignmentrange-frameself-join

按月汇总已付款订单的金额,并计算同比:yoy = 本月金额 / 去年同月金额 - 1。

  • 只统计 status = 'paid' 的订单。
  • 订单行金额 = qty * unit_price * (1 - discount),discount 为 null 表示没有折扣(按 0 算)。
  • 月份按 order_ts 所在的自然月划分,用该月 1 日的日期表示(列 month)。
  • 只输出有已付款订单的月份;amount 是该月金额之和。
  • “去年同月”按日历对齐:2026-03 的去年同月是 2025-03。月份序列中间可能缺月,所以不能简单地取往前数第 12 个月份行。
  • 去年同月没有已付款订单(即结果里不存在那一行)时,yoy 为 null。

输入

  • orders(order_id, customer_id, order_ts, status, channel)
  • order_items(order_id, product_id, qty, unit_price, discount)

输出

列为 month(日期)、amount、yoy,每个月一行,行顺序不限。

输入表 (case base,共 2 个 case:base、gaps)

orders shop/orders
#order_idint64customer_idint64order_tsdatetimestatusstringchannelstring
1 1001 39 2026-01-01 19:38:00 paid app
2 1002 16 2026-01-17 14:07:00 paid app
3 1003 4 2026-01-08 15:40:20 cancelled web
4 1004 2 2026-05-23 10:48:58 paid null
5 1005 12 2026-06-22 11:07:22 paid store
6 1006 17 2026-08-15 05:15:25 paid web
7 1007 9 2026-06-11 01:00:32 refunded store
8 1008 45 2026-09-19 20:47:10 paid web
9 1009 2 2025-10-05 04:53:38 paid app
10 1010 4 2026-02-19 01:39:54 paid app
11 1011 28 2026-03-05 03:04:45 refunded store
12 1012 2 2026-08-01 07:09:17 paid web
13 1013 26 2026-01-22 03:48:14 refunded store
14 1014 2 2026-02-09 01:41:41 paid app
15 1015 5 2026-08-03 19:49:04 refunded web
16 1016 26 2026-02-16 00:43:43 refunded app
17 1017 9 2025-12-06 04:48:57 pending app
18 1018 999 2026-05-19 12:13:43 paid store
19 1019 26 2026-02-05 15:02:26 paid store
20 1020 44 2025-11-24 11:19:00 cancelled web
显示前 20 行,共 200 行
order_items shop/order_items
#order_idint64product_idint64qtyint64unit_pricefloat64discountfloat64
1 1001 22 3 298.8 null
2 1001 26 1 190.0 0.1
3 1002 6 2 254.2 0.0
4 1002 9 3 79.0 null
5 1002 19 5 305.1 0.2
6 1003 9 2 79.0 0.1
7 1003 28 2 47.4 0.0
8 1004 5 1 500.0 0.1
9 1005 3 1 89.0 0.0
10 1005 12 4 45.0 null
11 1006 13 1 19.9 0.1
12 1006 25 2 39.9 null
13 1007 27 1 12.5 null
14 1008 3 1 89.0 null
15 1008 16 1 29.9 null
16 1008 17 1 129.0 null
17 1009 2 1 49.9 0.0
18 1009 10 2 42.5 null
19 1009 20 1 84.5 0.05
20 1010 1 1 23.8 0.1
显示前 20 行,共 500 行

期望输出 (case base,行顺序不限)

#monthDateamountFloat64yoyFloat64
1 2025-08-01 4393.47 null
2 2025-09-01 504.215 null
3 2025-10-01 1348.525 null
4 2025-11-01 3626.055 null
5 2025-12-01 5329.19 null
6 2026-01-01 9820.455 null
7 2026-02-01 7838.01 null
8 2026-03-01 2398.475 null
9 2026-04-01 3155.16 null
10 2026-05-01 9858.34 null
11 2026-06-01 2990.09 null
12 2026-07-01 5001.625 null
13 2026-08-01 3760.965 -0.1439647932
14 2026-09-01 4682.02 8.285761034
共 14 行