kdb/q中如何迭代传递更新后的表A至函数实现条件插入
Kdb/q 迭代累积更新表A的解决方案
问题分析
你之前的尝试里,each 是并行处理每个迭代器元素,所有分支都用初始状态的 A,没法累积更新;错误的 fold(/)用法也没正确传递累积的 A 状态,导致复用更新后的表的逻辑失效。
修正方案
核心是用fold迭代器(/),它会把每次迭代的结果作为下一次的输入,实现状态累积。同时简化原函数逻辑,去掉不必要的select操作:
步骤1:实现迭代逻辑
可以直接在fold的匿名函数里处理判断,不用单独定义f:
// 初始化A为B的首行 A: 1#B; // 从B的第2行(对应kdb内置索引i=1)开始迭代 result: {[currentA; z] // 获取A最后一行的rdn值,以及B第z行的记录 lastRdn: last currentA[`rdn]; bRow: B[z]; // 判断条件:A最后一行rdn < B当前行rdn,且B当前行col2为`remove if[lastRdn < bRow[`rdn]; bRow[`col2] = `remove; currentA,:bRow]; // 返回更新后的A作为下一次迭代的输入 currentA }/[A; 1 til count B]
更简洁的kdb风格写法
用kdb三元运算符$[]精简代码:
A:1#B; result: {[a;z] $[last a.rdn < B[z].rdn; B[z].col2 = `remove; a,:B[z]; a]}/[A; 1 til count B]
验证结果
执行后result会得到预期的表:
rdn col2 -------- 6 remove 8 remove
关键说明
1 til count B生成从1到count B-1的索引,对应B的第2行到最后一行(kdb中表的内置索引i从0开始)。,:用于在表末尾追加符合条件的行,比upsert更适合单纯的行追加场景。- fold迭代器
/的第一个参数是初始值(这里是A),第二个参数是迭代元素列表,每次迭代会把当前累积值和列表元素传入匿名函数,实现状态的持续更新。
内容的提问来源于stack exchange,提问作者newbie_112358
相关产品推荐
相关产品推荐

