如何基于列表索引范围更新KDB+表中的列表类型列
KDB+ 批量更新列表列指定索引范围元素
给定你提供的表结构:
tab:([] date:2024.01.01+til 30;sym:30?`appl`msgt`googl;volume:30#(enlist 0.5+300?til 100));
要更新指定行(比如第一行,i=0)的volume列中某索引范围的元素为0,这里提供两种可行方案:
方案1:用@函数直接替换范围
@是KDB+里用于索引赋值的核心函数,能直接对列表的指定索引批量赋值。结合update语句就能实现需求:
// 先定义要修改的索引范围 startIdx:10; // 起始索引 endIdx:20; // 结束索引 // 执行更新:仅修改i=0行的volume列指定范围 tab:update volume:@[volume; startIdx+til(endIdx-startIdx+1);:;0] from tab where i=0;
startIdx+til(endIdx-startIdx+1):生成从startIdx到endIdx的所有连续索引(包含两端)@[volume; 索引列表;:;0]:把volume列表中对应索引的元素全部替换为0- 最后通过
update将修改后的列表覆盖原行的volume值
方案2:切片拼接生成新列表
如果更习惯用列表切片的方式,也可以通过拼接前后未修改部分和中间全0列表实现:
startIdx:10; endIdx:20; tab:update volume:volume[0:startIdx], (endIdx-startIdx+1)#0, volume[endIdx+1:] from tab where i=0;
volume[0:startIdx]:截取volume列表中从开头到startIdx前的元素(endIdx-startIdx+1)#0:生成和目标范围长度一致的全0列表volume[endIdx+1:]:截取volume列表中endIdx之后的剩余元素- 三者按顺序拼接就是修改后的完整列表
验证结果
更新完成后,用以下命令检查指定范围的元素是否已变为0:
exec volume[startIdx:endIdx] from tab where i=0;
内容的提问来源于stack exchange,提问作者BlackPearl
相关产品推荐
相关产品推荐

