如何用KQL获取插值时间范围起始边界的插值计算值?
优化Kusto边界点插值计算:更简洁的实现
针对带时间间隔的实时数据表,要在指定起始时间点通过前后最近的有效数据完成线性插值,这里提供比你现有实现更简洁高效的方案:
优化后的代码
let interpolate_boundary = (T:(Date:datetime, Value:real), target:datetime) { T | where isnotnull(Value) | extend is_before = Date <= target | partition by is_before ( sort by Date case(is_before, desc, asc) | take 1 ) | summarize prev_date = minif(Date, Date > target), prev_val = minif(Value, Date > target), next_date = maxif(Date, Date <= target), next_val = maxif(Value, Date <= target) | extend time_diff = datetime_diff('second', next_date, prev_date), target_diff = datetime_diff('second', target, prev_date), interpolated_val = prev_val + (next_val - prev_val) * (target_diff * 1.0 / time_diff) | project Date = target, Value = interpolated_val }; // 调用示例 interpolate_boundary(LongTermWeight | project Date, Value, datetime("2023-09-14"))
优化说明
- 减少冗余查询:用
partition by一次性筛选目标时间前后的最近有效数据,替代原代码中两次独立的prev/next查询,逻辑更紧凑 - 简化变量提取:通过
minif/maxif在单次summarize中提取所需的日期和数值,避免多次toscalar调用,提升代码可读性 - 精度与可读性提升:使用
datetime_diff以秒为单位计算时间差,避免toint带来的精度损失;线性插值公式直接清晰,易维护 - 语义化命名:函数和变量命名更贴合业务逻辑,降低理解成本
注:原代码中存在变量名不一致问题(参数用Value但查询中用Weight),优化后的代码已统一为Value。
内容的提问来源于stack exchange,提问作者user3677862
相关产品推荐
相关产品推荐

