KDB表中基于标量列过滤列表列元素的技术问题
KDB+ 列表列的逐行过滤问题
首先是原始表的创建代码及输出:
w:(1 2;3 4;5 2); l:til count w; h:l+1; show t:([] l; h; w);
输出结果:
l h w ------- 0 1 1 2 1 2 3 4 2 3 5 2
需求是:表t的w列每行都是列表,需要保留每行w中处于对应行l和h之间的元素,预期输出如下:
l h w ------- 0 1 ,1 1 2 , 2 3 ,2
你尝试的代码:
t:update w:w[where ((w>=l) and (w<=h))] from t;
执行时触发类型错误:
'type [0] t:update w:w[where ((w>=l) and (w<=h))] from t;
错误原因
w是由列表组成的列,直接用w>=l会尝试将整个列表列与标量列l做维度不匹配的逐元素比较,导致类型错误。必须逐行处理,让每行的w列表和对应行的l、h标量做比较。
解决方法
可以使用KDB+的each操作符来逐行应用过滤逻辑,有两种简洁写法:
写法1:使用each-both(')绑定列
t:update w:{x where x >= y, x <= z}'[w; l; h] from t;
这里的'会将匿名函数逐行应用到w、l、h三列的对应元素上,每行的w列表(x)、l标量(y)、h标量(z)传入函数,过滤出符合条件的元素。
写法2:遍历表的每行
t:update w:{[row] row[2] where row[2] >= row[0], row[2] <= row[1]} each row t from t;
row t会返回表的每行数据(每行是一个包含l、h、w的列表),匿名函数接收每行数据后,取出w列(row[2])并根据l(row[0])和h(row[1])过滤元素。
执行任意一种写法后,表t都会得到预期的输出结果。
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

