Kusto中如何按员工分组计算相邻事件的经过时长?
Kusto 按用户分组计算相邻事件间隔实现方案
该需求可以直接实现,只需要调整排序逻辑并为next()函数指定分组范围即可,以下是修正后的查询语句:
let T = datatable(EmpId:string , Terminal:string, TimeStamp:datetime ) [ "1", "A", datetime(2021-11-16 05:00:15), "2", "B", datetime(2021-11-16 05:00:15), "1", "B", datetime(2021-11-16 06:05:00), "1", "A", datetime(2021-11-16 08:00:15), "2", "B", datetime(2021-11-16 11:00:15), "2", "C", datetime(2021-11-16 09:00:15), ]; T | order by EmpId asc, TimeStamp asc | extend elapsedTime = datetime_diff('minute', next(TimeStamp, 1, EmpId), TimeStamp) | summarize Terminal = strcat_array(make_list(Terminal), "->"), TimeStamp = strcat_array(make_list(TimeStamp), "->"), TimeSpentinMins = strcat_array(make_list_if(elapsedTime, isnotnull(elapsedTime)), "->") by EmpId
核心修改说明
- 排序逻辑调整:将原来的全局按时间排序,改为先按
EmpId排序、同用户内再按TimeStamp升序排序,保证同一用户的所有记录连续且时序正确 next()函数限定分组:调用next(TimeStamp, 1, EmpId)时,第三个参数指定仅在同一个EmpId的分组内获取下一条记录的时间,不会跨用户读取数据- 过滤无效间隔:使用
make_list_if排除每个用户最后一条记录生成的空间隔值,输出结果和预期完全一致
输出结果
| EmpId | Terminal | TimeStamp | TimeSpentinMins |
|---|---|---|---|
| 1 | A->B->A | 2021-11-16 05:00:15->2021-11-16 06:05:00->2021-11-16 08:00:15 | 65->115 |
| 2 | B->C->B | 2021-11-16 05:00:15->2021-11-16 09:00:15->2021-11-16 11:00:15 | 240->120 |
内容的提问来源于stack exchange,提问作者Sahil Raj
相关产品推荐
相关产品推荐

