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

Kusto中SCAN运算符如何处理可选列?如何查找含偶发值的序列?

使用Kusto SCAN运算符捕获含偶发值的序列

可以通过调整SCAN的状态转移逻辑,实现捕获所有从A到C的序列(无论中间是否出现B)。以下是具体实现和原理说明:

解决方案代码

let Events = datatable (ts: datetime, Event: string) [
    datetime("2022-12-01"), "A", // 启动事件
    datetime("2022-12-02"), "B", // 偶发错误
    datetime("2022-12-03"), "C", // 结束事件
    datetime("2022-12-04"), "A", // 无错误的启动序列
    datetime("2022-12-05"), "C",
    datetime("2022-12-06"), "A", // 含无关事件的序列
    datetime("2022-12-07"), "D",
    datetime("2022-12-08"), "C"
]
;
Events
| sort by ts asc
| scan declare (in_sequence: bool = false, has_error: bool = false) with
(
    // 匹配到A,标记进入序列,重置错误状态
    step start: not in_sequence and Event == "A" => in_sequence = true, has_error = false;
    // 序列中匹配到B,标记错误存在
    step error: in_sequence and Event == "B" => has_error = true;
    // 序列中匹配到C,完成序列,输出后重置状态
    step end: in_sequence and Event == "C" => in_sequence = false, has_error = has_error;
    // 跳过序列中的无关事件,保持当前状态
    step skip: in_sequence and Event !in ("B", "C") => in_sequence = true, has_error = has_error;
)
| where not in_sequence // 仅保留已完成的A→C序列
| project 
    启动时间 = prev(ts), 
    启动事件 = prev(Event), 
    是否出现错误 = has_error, 
    结束时间 = ts, 
    结束事件 = Event

SCAN处理可选步骤的原理

SCAN本质是基于状态机的序列匹配工具,要实现可选元素的支持,核心是打破“必须按固定步骤顺序匹配”的限制,通过自定义状态变量跟踪序列进展:

  • 用declare定义状态变量(如in_sequence标记是否处于A之后的序列中,has_error标记是否出现过B),灵活控制状态转移。
  • 允许从“匹配A”的状态直接转移到“匹配C”的状态,同时保留经过B的路径,实现B的可选性。
  • 新增跳过无关事件的步骤,确保序列中间的非目标事件不会中断匹配逻辑。

原代码的问题在于强制要求按A→B→C的固定顺序匹配,只有三个事件全部存在时才会触发匹配;调整后的逻辑通过状态变量和多分支转移条件,覆盖了所有包含A和C的序列场景。

内容的提问来源于stack exchange,提问作者Werner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:45:28