You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_idcase_idcase_dtagenthow_to_get_agent_72hr备注
1case_12020-11-10 16:52:22SeanSean
1case_22020-11-25 17:50:55AlicoAlico
1case_32022-07-27 17:54:34KatherineKatherine
1case_42022-10-05 11:36:43VictorVictor
1case_52022-10-18 23:11:03AutomatedAutomated窗口1从此处开始
1case_62022-10-19 08:44:58DenzelAutomated
1case_72022-10-20 17:13:00SalesforceAutomated
1case_82022-10-20 17:15:44SalesforceAutomated窗口结束
1case_92023-02-24 12:32:16AryllAryll
1case_102023-11-02 17:29:04KristineKristine
1case_112023-12-23 16:34:00KatherineKatherine
1case_122024-04-05 17:47:00AlejandroAlejandro窗口2从此处开始
1case_132024-04-06 21:49:11AngelAlejandro
1case_142024-04-08 08:16:51WilbertAlejandro窗口结束
1case_152024-04-09 16:34:27EzekielEzekiel窗口3从此处开始
1case_162024-04-09 17:16:27RenzEzekiel
1case_172024-04-10 17:59:06RaymondEzekiel
1case_182024-04-11 22:35:56GlenEzekiel窗口结束
1case_192024-04-15 13:37:32RashidRashid

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:02:33