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

区间连接

困难 11-join 连接 joinrangenon-equiintervalvalidity

为每个订单行找到下单当天生效的标价。

  • 下单日期 order_date 取订单 order_ts 的日期部分。
  • 价格表里同一商品的价格区间为 [valid_from, valid_to):含起点、不含终点,即生效条件是 valid_from ≤ order_date < valid_to。valid_to 为 null 表示这个价格至今仍然有效(没有终点)。
  • 同一商品的区间首尾相接、互不重叠,所以每个订单行最多匹配一个价格。恰好落在两个区间交界那天的订单,用新价格。
  • 找不到生效价格的订单行(商品没有价格历史,或者下单早于最早的 valid_from)不输出。

输入

  • order_items(order_id, product_id, qty, unit_price, discount)
  • orders(order_id, customer_id, order_ts, status, channel)
  • price_history(product_id, valid_from, valid_to, price)

输出

列为 order_id, product_id, order_date, list_price,其中 order_date 是日期,list_price 是价格表的 price。行顺序不限。

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

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 行
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 行
price_history shop/price_history
#product_idint64valid_fromdatevalid_todatepricefloat64
1 1 2025-01-01 2026-01-03 27.5
2 1 2026-01-03 2026-05-25 23.8
3 1 2026-05-25 null 25.0
4 4 2025-01-01 2025-11-10 238.8
5 4 2025-11-10 2026-03-04 189.0
6 4 2026-03-04 null 199.0
7 5 2025-01-01 2025-09-01 550.0
8 5 2025-09-01 2025-11-21 525.0
9 5 2025-11-21 null 500.0
10 6 2025-01-01 2026-01-05 269.1
11 6 2026-01-05 2026-05-30 254.2
12 6 2026-05-30 null 299.0
13 7 2025-01-01 2026-01-08 53.1
14 7 2026-01-08 2026-05-27 50.1
15 7 2026-05-27 null 59.0
16 10 2025-01-01 2025-08-26 45.0
17 10 2025-08-26 2025-10-31 42.5
18 10 2025-10-31 null 50.0
19 12 2025-01-01 2025-11-18 49.5
20 12 2025-11-18 2026-02-04 42.8
显示前 20 行,共 60 行

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

#order_idInt64product_idInt64order_dateDatelist_priceFloat64
1 1189 1 2026-03-29 23.8
2 1182 4 2026-05-09 199.0
3 1198 5 2026-04-18 500.0
4 1177 6 2026-02-12 254.2
5 1183 7 2025-12-28 53.1
6 1198 10 2026-04-18 50.0
7 1193 12 2025-12-13 42.8
8 1196 13 2026-01-19 20.9
9 1194 16 2025-12-03 29.9
10 1180 18 2026-05-20 199.0
11 1200 19 2025-08-15 430.8
12 1199 20 2026-01-14 84.5
13 1197 22 2025-12-26 298.8
14 1185 24 2026-04-19 15.0
15 1186 25 2025-12-05 37.9
16 1189 26 2026-03-29 200.0
17 1195 28 2026-01-09 47.4
18 1171 29 2026-07-16 159.0
19 1162 1 2026-09-01 25.0
20 1180 4 2026-05-20 199.0
21 1197 5 2025-12-26 500.0
22 1172 6 2026-08-05 299.0
23 1152 7 2025-12-11 53.1
24 1192 10 2025-11-16 50.0
25 1190 12 2026-05-13 45.0
26 1176 13 2026-04-17 19.9
27 1159 16 2025-12-10 29.9
28 1175 18 2026-05-28 199.0
29 1196 19 2026-01-19 305.1
30 1198 20 2026-04-18 89.0
31 1187 22 2026-07-06 261.4
32 1168 24 2026-05-01 15.0
33 1175 25 2026-05-28 39.9
34 1184 26 2026-08-30 200.0
35 1187 28 2026-07-06 49.9
36 1153 29 2026-02-15 151.0
37 1138 1 2025-09-09 27.5
38 1177 4 2026-02-12 189.0
39 1185 5 2026-04-19 500.0
40 1157 6 2026-06-11 299.0
41 1147 7 2026-04-09 50.1
42 1171 10 2026-07-16 50.0
43 1187 12 2026-07-06 45.0
44 1140 13 2026-04-29 19.9
45 1156 16 2026-07-24 29.9
46 1156 18 2026-07-24 199.0
47 1191 19 2026-05-24 359.0
48 1192 20 2025-11-16 84.5
49 1176 22 2026-04-17 261.4
50 1164 24 2025-11-27 15.8
显示前 50 行,共 335 行