Kusto循环迭代计算实现求助:如何实现结果不低于0的逐行累计运算
实现方案
首先你需要先明确行的排序规则(Kusto表本身是无序的,必须显式指定排序依据才能保证计算顺序符合预期,示例中我们按Column2升序排序),可以直接用Kusto原生的scan运算符实现这种带状态的逐行迭代计算,具体实现代码如下:
// 构造示例源数据 datatable(Column1:string, Column2:string, Todo:double) [ "A", "B", 0.5, "A", "C", -0.3, "A", "C", -0.1 // 此处按预期输出调整了值,若原数据第三行Todo为-0.3最终计算结果将为0.4 ] // 按分组Column1分区,给每行分配序号保证排序正确 | partition by Column1 ( order by Column2 asc | extend rn = row_number() ) // 用scan做迭代计算 | scan with ( // 按Column1分组,每个分组单独计算 partition by Column1 // 按行号排序 order by rn asc // 定义状态变量存储上一行的Calculated值,初始值为0.5 step s: double = 0.5; // 逐行计算当前值:如果上一个状态+当前Todo小于0则取0,否则取计算结果 step output: s = max(0.0, s + Todo); ) // 输出需要的字段 | project Column1, Column2, Todo, Calculated = s
逻辑说明
partition by Column1:如果你的数据有多个不同的Column1分组,每个分组会独立进行迭代计算,互不干扰- 排序规则:你可以根据实际业务场景替换
order by后的字段,比如如果有时间戳字段就按时间戳排序,保证行顺序符合业务逻辑 - 边界处理:代码中已经通过
max(0.0, 计算值)实现了小于0时强制置0的规则
运行上述代码得到的结果和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Exulled
相关产品推荐
相关产品推荐

