如何在同一数据表中实现不同行不同列的数值相减?
Kusto实现跨行列数值相减与列填充
需求说明
需要对同一数据表中不同行的列值进行计算:用A2行的C3值减去A1行的C2值,同时生成填充后的C2New列,最终得到目标数据表。
修正测试数据
你提供的测试代码中部分值和示例表不符,先修正为符合示例的空值结构:
let X = datatable(c1:string, c2:int, c3:int) [ 'a1', 2, int(null), 'a2', int(null), 3, 'b1', int(null), 4 ];
实现查询
通过toscalar提取固定值,结合case函数实现列填充与差值计算,代码如下:
let X = datatable(c1:string, c2:int, c3:int) [ 'a1', 2, int(null), 'a2', int(null), 3, 'b1', int(null), 4 ]; // 提取A1行的C2值作为全局标量 let a1_c2 = toscalar(X | where c1 == 'a1' | project c2); X // 生成C2New列:A1、A2行填充为A1的C2值,其他行保留原C2值 | extend C2New = case(c1 in ('a1', 'a2'), a1_c2, c2) // 生成C4列:仅A2行计算C3 - C2New的差值,其他行留空 | extend C4 = case(c1 == 'a2', c3 - C2New, int(null)) // 按目标表顺序展示列 | project c1, c2, C2New, c3, C4
查询结果
执行后会得到和你目标表一致的输出:
| c1 | c2 | C2New | c3 | C4 |
|---|---|---|---|---|
| a1 | 2 | 2 | ||
| a2 | 2 | 3 | 1 | |
| b1 | 4 |
思路说明
- 用
toscalar直接提取A1行的C2值,避免了join/self-join可能带来的复杂行关联问题,更适合这种单值引用场景。 case函数用来精准控制不同行的列值填充与计算逻辑,只对需要处理的行(A1、A2)进行操作,其他行保持原有状态。
内容的提问来源于stack exchange,提问作者DarkCookieMatter
相关产品推荐
相关产品推荐

