如何在Snowflake数据集中计算基于72小时窗口的代理分配逻辑?
Snowflake工单代理72小时窗口分配实现需求
需求规则
使用Snowflake数据库处理客户工单数据集,需生成how_to_get_agent_72hr列,规则如下:
- 若工单创建时间处于某窗口起始工单的72小时范围内,则继承该窗口起始工单的代理。
- 窗口的72小时从起始工单的创建时间开始计算,超出该范围的工单将作为新窗口的起始。
重要说明:case_15的创建时间虽在case_14的72小时内,但不分配给Alejandro,因为Alejandro对应的窗口始于2024-04-05 17:47:00,结束于2024-04-08 17:47:00,72小时时长从窗口起始时间开始计算。
数据集示例
| customer_id | case_id | case_dt | agent | how_to_get_agent_72hr | 备注 |
|---|---|---|---|---|---|
| 1 | case_1 | 2020-11-10 16:52:22 | Sean | Sean | |
| 1 | case_2 | 2020-11-25 17:50:55 | Alico | Alico | |
| 1 | case_3 | 2022-07-27 17:54:34 | Katherine | Katherine | |
| 1 | case_4 | 2022-10-05 11:36:43 | Victor | Victor | |
| 1 | case_5 | 2022-10-18 23:11:03 | Automated | Automated | 窗口1从此处开始 |
| 1 | case_6 | 2022-10-19 08:44:58 | Denzel | Automated | |
| 1 | case_7 | 2022-10-20 17:13:00 | Salesforce | Automated | |
| 1 | case_8 | 2022-10-20 17:15:44 | Salesforce | Automated | 窗口结束 |
| 1 | case_9 | 2023-02-24 12:32:16 | Aryll | Aryll | |
| 1 | case_10 | 2023-11-02 17:29:04 | Kristine | Kristine | |
| 1 | case_11 | 2023-12-23 16:34:00 | Katherine | Katherine | |
| 1 | case_12 | 2024-04-05 17:47:00 | Alejandro | Alejandro | 窗口2从此处开始 |
| 1 | case_13 | 2024-04-06 21:49:11 | Angel | Alejandro | |
| 1 | case_14 | 2024-04-08 08:16:51 | Wilbert | Alejandro | 窗口结束 |
| 1 | case_15 | 2024-04-09 16:34:27 | Ezekiel | Ezekiel | 窗口3从此处开始 |
| 1 | case_16 | 2024-04-09 17:16:27 | Renz | Ezekiel | |
| 1 | case_17 | 2024-04-10 17:59:06 | Raymond | Ezekiel | |
| 1 | case_18 | 2024-04-11 22:35:56 | Glen | Ezekiel | 窗口结束 |
| 1 | case_19 | 2024-04-15 13:37:32 | Rashid | Rashid |
Snowflake SQL实现方案
通过标记窗口起始、生成分组ID,再继承窗口起始代理值,代码如下:
WITH case_with_window_start AS ( SELECT customer_id, case_id, case_dt, agent, -- 标记新窗口起始:首行 或 当前时间超出当前累积窗口起始的72小时 CASE WHEN LAG(case_dt) OVER (PARTITION BY customer_id ORDER BY case_dt) IS NULL THEN 1 WHEN case_dt > DATEADD(HOUR, 72, FIRST_VALUE(case_dt) OVER ( PARTITION BY customer_id ORDER BY case_dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )) THEN 1 ELSE 0 END AS is_window_start FROM your_case_table ), case_with_window_group AS ( SELECT *, -- 累积求和生成窗口分组ID SUM(is_window_start) OVER (PARTITION BY customer_id ORDER BY case_dt) AS window_group_id FROM case_with_window_start ) SELECT customer_id, case_id, case_dt, agent, -- 取窗口首行的代理值作为整组的结果 FIRST_VALUE(agent) OVER (PARTITION BY customer_id, window_group_id ORDER BY case_dt) AS how_to_get_agent_72hr FROM case_with_window_group ORDER BY customer_id, case_dt;
关键逻辑说明
PARTITION BY customer_id:确保每个客户的窗口独立计算,避免跨客户干扰。is_window_start标记:判断是否需要开启新窗口,核心是检查当前工单时间是否超出当前已累积窗口起始时间的72小时。window_group_id:通过累积起始标记的求和,将同一窗口的工单归为同一组。FIRST_VALUE(agent):为同一窗口的所有工单取起始行的代理值,生成目标列。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

