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

Kusto物化视图无需数据序列化按用户名及时间戳查找下一条记录

ADX物化视图计算用户状态持续时长的绕过方案

ADX 物化视图默认不支持显式sort排序及序列化上下文下的next()/prev()函数,可通过以下两种合规方案实现需求:

方案1:使用scan运算符编写物化视图(推荐)

scan是ADX专门用于序列场景处理的运算符,支持在用户分区内按时间戳有序处理,无需显式写全局sort语句,完全符合物化视图的语法限制。

物化视图创建示例

假设你的源表名为UserStatusLog,物化视图定义如下:

.create materialized-view UserStatusDuration on table UserStatusLog
{
    UserStatusLog
    | partition by Username
    (
        scan order by Timestamp asc with 
        (
            step s: true;
        )
        | extend End = s_Next_Timestamp
        | extend Duration = End - Timestamp
        | project Username, Start = Timestamp, End, Status, Duration
    )
}

测试验证

用你提供的示例数据运行该逻辑,输出结果和预期完全一致:

let data=datatable (Username:string, Timestamp:datetime, Status:int)
[
  "Jimmy", datetime(2021-10-01 12:30:00), 1,
  "Joan", datetime(2021-10-01 12:34:56), 1,
  "Joan", datetime(2021-10-01 13:34:56), 2,
  "Jimmy", datetime(2021-10-01 14:34:56), 2,
  "Jimmy", datetime(2021-10-01 16:34:56), 1,
  "Joan", datetime(2021-10-01 18:34:34), 1,
  "Joan", datetime(2021-10-01 18:38:20), 2,
  "Joan", datetime(2021-10-01 18:45:16), 1,
];
data
| partition by Username
(
    scan order by Timestamp asc with 
    (
        step s: true;
    )
    | extend End = s_Next_Timestamp
    | extend Duration = End - Timestamp
    | project Username, Start = Timestamp, End, Status, Duration
)

方案2:使用更新策略替代物化视图

如果你的场景需要更灵活的逻辑处理(比如需要修正历史状态、合并重复记录等),可改用更新策略实现:

  1. 新建一张目标表UserStatusDuration,结构和你需要的输出字段一致
  2. 为源表UserStatusLog配置更新策略,触发逻辑为你原本的带sort和next的计算查询,新数据写入时自动计算结果写入目标表
    更新策略支持全量KQL语法,没有序列化操作的限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:39:04