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

无会话ID仅含会话开始事件时如何在Kusto中重建会话

Kusto 无会话结束事件的会话标记实现方案

核心逻辑

不需要复刻SQL的last_value()空值填充逻辑,直接用Kusto内置的分区累计求和算子即可实现需求,逻辑如下:

  • 按玩家ID分区,对所有事件按时间戳升序排序
  • 标记每一行是否为client_session_start会话开始事件,是则标记为1,其余事件标记为0
  • 对每个玩家分区内的标记值做累计求和,累计值即为该玩家维度下的会话序号
  • 拼接玩家ID与会话序号,即可得到全局唯一的会话ID:两次相邻会话开始之间的所有事件、最后一次会话开始后的所有事件,都会自动关联到最近一次会话开始对应的ID,完全覆盖需求场景

可直接运行的示例代码

// 替换为自己的实际业务表名即可
let raw_data = datatable(ID_player:string, Timestamp:datetime, event_name:string)
[
    "aaa", datetime(2024-01-01 12:00:00), "client_session_start",
    "aaa", datetime(2024-01-01 12:10:00), "game_operation",
    "aaa", datetime(2024-01-01 12:20:00), "item_buy",
    "aaa", datetime(2024-01-01 12:30:00), "client_session_start",
    "aaa", datetime(2024-01-01 12:40:00), "battle_settle",
    "aaa", datetime(2024-01-01 12:50:00), "app_background",
    "bbb", datetime(2024-01-01 11:00:00), "client_session_start",
    "bbb", datetime(2024-01-01 11:15:00), "daily_reward_claim"
];

raw_data
| order by ID_player asc, Timestamp asc
// 标记会话开始事件
| extend is_session_start = iff(event_name == "client_session_start", 1, 0)
// 分玩家累计求和生成会话序号,切换玩家时自动重置计数
| extend session_seq = row_cumsum(is_session_start, ID_player != prev(ID_player))
// 生成自定义格式的会话ID
| extend session_id = strcat(ID_player, "_s", session_seq)
// 可按需保留/删除字段
| project-away is_session_start, session_seq

关键算子说明

  • row_cumsum:Kusto原生累计求和算子,第二个参数为计数重置条件,此处判断当前行和上一行玩家ID不一致时,自动将累计值清零重新计算,天然适配分用户统计的场景
  • 如果需要在会话ID中携带会话开始时间、自定义哈希等信息,只需在生成session_id的步骤调整拼接规则即可,不需要改动核心分组逻辑

注意事项

如果存在玩家维度下第一条事件不是client_session_start的异常数据,这部分数据的会话序号会是0,可根据业务规则直接过滤,或单独标记为未知会话。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:39:32