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

多条件分级

中等 04-expr 新列与条件表达式 case-whencondition-orderleft-joingroupby

给每个客户评一个运营等级 level。

先算每个客户的已付款订单数 paid_orders:status = 'paid' 的订单数;没有已付款订单的客户(包括从没下过单的)记为 0。

然后按下面的顺序逐条检查规则,命中第一条就停:

  1. paid_orders = 0 → inactive
  2. tier = 'gold',或 paid_orders ≥ 5 → vip
  3. tier = 'silver' 且 paid_orders ≥ 2 → core
  4. 其余 → regular

  5. 规则的先后很重要:一个 gold 客户如果没有已付款订单,等级是 inactive 而不是 vip。

  6. tier 为 null 的客户不是 gold 也不是 silver,但仍可能因订单数 ≥ 5 而成为 vip。
  7. 客户表里的每个客户都要输出一行;orders 中客户表里没有的 customer_id(以及 null)忽略。

输入

  • customers(customer_id, name, email, city, signup_date, tier)
  • orders(order_id, customer_id, order_ts, status, channel)

输出

列为 customer_id, tier, paid_orders, level,paid_orders 为整数,行顺序不限。

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

customers shop/customers
#customer_idint64namestringemailstringcitystringsignup_datedatetierstring
1 1 Fang Wang fang.wang@shop.io Beijing 2025-03-13 silver
2 2 Dana Xu dana.xu@mail.cn null 2025-02-17 silver
3 3 Li Zhou li.zhou@example.com Guangzhou 2025-10-07 bronze
4 4 Ping Wang ping.wang@example.com null 2025-05-23 gold
5 5 Tom Zhang tom.zhang@example.com Shenzhen 2025-06-26 gold
6 6 王芳 user06@shop.io Hangzhou 2025-02-10 gold
7 7 Victor Xu victor.xu@example.com Shanghai 2025-12-05 bronze
8 8 Dana Chen dana.chen@example.com Hangzhou 2025-11-22 bronze
9 9 Uma Chen uma.chen@shop.io Guangzhou 2025-11-28 null
10 10 Ivy Zhou ivy.zhou@shop.io Hangzhou 2025-07-14 gold
11 11 Mia Smith mia.smith@mail.cn Shanghai 2025-04-28 gold
12 12 Xin Yang xin.yang@example.com Chengdu 2026-01-03 silver
13 13 Xin Smith xin.smith@mail.cn Beijing 2025-05-07 silver
14 14 Zoe Xu zoe.xu@mail.cn Beijing 2025-09-18 silver
15 15 Fang Liu fang.liu@shop.io Guangzhou 2025-08-05 bronze
16 16 杨磊 user16@mail.cn Shanghai 2025-12-15 silver
17 17 Ping Smith ping.smith@mail.cn null 2025-08-11 bronze
18 18 Oscar Zhou oscar.zhou@example.com Shanghai 2025-11-17 null
19 19 Kevin Liu kevin.liu@mail.cn Chengdu 2026-02-03 gold
20 20 Sara Wu sara.wu@example.com null 2025-07-05 gold
显示前 20 行,共 50 行
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 行

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

#customer_idInt64tierStringpaid_ordersInt64levelString
1 2 silver 14 vip
2 4 gold 1 vip
3 5 gold 10 vip
4 6 gold 3 vip
5 8 bronze 2 regular
6 9 null 7 vip
7 10 gold 1 vip
8 11 gold 4 vip
9 12 silver 9 vip
10 13 silver 1 regular
11 16 silver 2 core
12 17 bronze 2 regular
13 18 null 10 vip
14 19 gold 1 vip
15 21 null 5 vip
16 22 null 5 vip
17 24 gold 1 vip
18 25 null 2 regular
19 26 bronze 9 vip
20 27 silver 2 core
21 28 bronze 2 regular
22 29 bronze 3 regular
23 31 null 1 regular
24 32 bronze 1 regular
25 34 bronze 2 regular
26 36 bronze 2 regular
27 38 bronze 2 regular
28 39 bronze 2 regular
29 40 null 1 regular
30 42 bronze 2 regular
31 43 null 1 regular
32 44 bronze 1 regular
33 45 null 2 regular
34 46 silver 1 regular
35 47 silver 2 core
36 49 gold 2 vip
37 50 null 2 regular
38 1 silver 0 inactive
39 3 bronze 0 inactive
40 7 bronze 0 inactive
41 14 silver 0 inactive
42 15 bronze 0 inactive
43 20 gold 0 inactive
44 23 bronze 0 inactive
45 30 null 0 inactive
46 33 silver 0 inactive
47 35 bronze 0 inactive
48 37 bronze 0 inactive
49 41 bronze 0 inactive
50 48 silver 0 inactive
共 50 行