KQL中调用函数传入日期时间范围报错,求解决方案
问题原因
错误提示argument #1 must be a scalar expression的核心原因是类型不匹配:
MyFunction定义的参数x是标量datetime类型(单个日期值)- 调用时传入的
range timestamp from startDate to endDate step 1生成的是包含多行timestamp的表类型,不符合函数参数要求。
另外原调用中的step 1会生成每秒的日期数据,显然不符合按天统计的业务逻辑,后续方案中将调整为step 1d(按天遍历)。
解决方案
提供两种可行方案,可根据需求选择:
方案1:修改函数接收起止日期,内部处理遍历
直接让MyFunction接收起始、结束日期两个标量参数,内部生成每日日期序列并调用MyMetrics:
// 重新定义接收起止日期的MyFunction let MyFunction = (startDate:datetime, endDate:datetime) { // 生成从startDate到endDate的每日日期列表 range day from startDate to endDate step 1d // 对每个日期,调用MyMetrics(前一天, 当前日期) | invoke MyMetrics(day - 1d, day) }; // 定义目标日期范围 let startDate = datetime(2023-07-15); let endDate = datetime(2023-07-17); // 调用函数 MyFunction(startDate, endDate)
方案2:保留原单参数函数,用mv-apply遍历表
如果不想修改MyFunction的参数定义,可通过mv-apply将range生成的表逐行传入函数:
// 保留原MyFunction定义 let MyFunction = (x:datetime) { MyMetrics(x - 1d, x) }; // 定义目标日期范围 let startDate = datetime(2023-07-15); let endDate = datetime(2023-07-17); // 生成每日日期表,逐行调用MyFunction range timestamp from startDate to endDate step 1d | mv-apply timestamp on (MyFunction(timestamp))
补充说明
- 原
MyMetrics函数中,last1daydata的summarize包含bin(timestamp, 1d),但后续join仅关联CarType和operation,该字段不影响join结果,若不需要可直接移除。 - 需确保
Events表存在且包含totalCount、operation、CarType、timestamp字段,否则会触发字段不存在的错误。
内容的提问来源于stack exchange,提问作者susanna
相关产品推荐
相关产品推荐

