如何在KDB+的UPDATE语句中使用amend并处理Null值
Kdb+ 表列更新问题解决方案
表创建代码
现有表tab,创建代码如下:
tab:update volume:0n from ([] date:2024.01.01+til 10;sym:10?`appl`msgt`googl;volume:10#(enlist 0.5+300?til 100)) where i in (1;5;8);
需求说明
需要对volume列执行以下更新操作:
- 将数组索引299的桶值复制到索引200的位置
- 将数组索引201至299的所有桶值设为0
问题场景
使用amend函数可以实现上述修改,但当volume列中存在空/Null值时,会触发类型错误。我们需要仅对非空的volume元素执行修改,空/Null值保持原样。
最优实现代码
以下是满足需求的代码,可直接处理整张表,自动跳过空值:
update volume:{ $[not null x; amend[x; (200; 201+til 99); (x[299]; 0)]; x ] }'[volume] from tab
代码逻辑说明
not null x:判断当前volume元素是否为非空数组,空值直接返回原数据amend[x; (200; 201+til 99); (x[299]; 0)]:对非空数组执行修改:- 第一个参数
x是原数组 - 第二个参数是要修改的索引集合:单独的200,以及201到299的连续索引
- 第三个参数是对应索引要设置的值:200位置设为原数组299位置的值,201-299位置设为0
- 第一个参数
- 最后通过
'(each)运算符,对volume列的每个元素逐一处理
内容的提问来源于stack exchange,提问作者BlackPearl
相关产品推荐
相关产品推荐

