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

如何通过函数在Kusto表中生成数组累积值列?

用函数实现Kusto表的数组形式累积值列

你的问题本质是Kusto自定义函数在行上下文和表级上下文的执行限制导致的:原函数单独调用时是在表级上下文执行,能正常返回结果,但放到extend(行上下文)里调用时,要么因为返回表类型触发表达式类型错误,要么用toscalar后无法跨行访问累积所需的前置数据,从而触发作用域错误。

要通过函数实现需求,需要调整函数的设计逻辑,让它适配表级计算场景,而不是在行上下文里调用。以下是两种可行的实现方式:

1. 全表范围的累积数组函数

把函数设计为接受原始表作为参数,直接返回带累积数组列的结果表,利用serialize实现行级累积拼接:

.create-or-alter function calculateCumulativeSum(t:(*)) {
    t
    | order by <你的排序字段> asc  // 必须指定排序逻辑,累积值依赖顺序
    | serialize cumulative_array = array_concat(prev(cumulative_array, dynamic([])), pack_array(fw))
}

调用方式直接传入你的表即可:

calculateCumulativeSum(你的表名)

这里serialize确保按排序后的顺序逐行计算,prev函数获取上一行的累积数组,再拼接当前行的fw值,最终得到每行对应的累积数组。

2. 分组分区的累积数组函数

如果需要按某列分组计算各自的累积数组,可以在函数中加入分区逻辑:

.create-or-alter function calculatePartitionedCumulativeSum(t:(*), partition_col:string) {
    t
    | order by toscalar(partition_col) asc, <你的排序字段> asc
    | partition by toscalar(partition_col) (
        serialize cumulative_array = array_concat(prev(cumulative_array, dynamic([])), pack_array(fw))
    )
}

调用时指定分组列:

calculatePartitionedCumulativeSum(你的表名, "分组列名")

为什么之前的方式行不通?

你之前的函数应该是返回表类型或者依赖表级计算逻辑,而extend是行上下文操作,只能调用返回标量/动态值的函数。但累积数组需要跨行访问前置数据,行上下文里无法直接实现,所以必须把整个累积逻辑封装成表处理函数,在表级上下文执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:17:11