kdb/q:再次将返回表传递给函数,使用另一个静态表和迭代器 i

问题描述 投票:0回答:1

如有任何解释不清楚,敬请谅解。我正在努力变得更好..

假设我有一个函数 f 和三个变量:一个空表 A(需要按顺序插入每一行),一个静态表 B 和一个迭代器 i

B: ([] rdn: 6 2 5 3 2 3 8; col2: 7#`remove;
A:1#B;
f:{[x;y;z] 
 temp_a: select from x where i = (max i);
 temp_b: select from y where i = z;
 if[(exec first rdn from temp_b) > (exec first rdn from temp_a); x: x upsert temp_b];
 :0!x;
};

从第 2 行(i = 2)开始,我想从 B 中获取第 i 行并与 A 的最后一行进行比较。 如果 (A[last row; rdn] < B[i; rdn] && B[i; col2] = `remove)

这是我想要的结果: |阅读全文 | col2 | | --- | ------ | | 6 |删除 | | 8 |删除 |

我的第一次尝试是做 夷平{[x;是; z] f[x;y;z]}[A; B; ] each (exec distinct i from B) //// 这不起作用,因为它不更新 A

我的第二次尝试是使用 over (/) {[x;y;z] f[x;y;z]}/[A; B; exec distinct i from B] // 绝对不对....

我不确定如何在函数中重新使用更新后的 A。我搜索了几个小时,但没有看到解决确切问题的相关帖子。提前感谢任何帮助!

kdb q
1个回答
0
投票

如果我没看错你的问题,你想要 B 中

rdn
大于前一个
rdn
AND col2=remove 的行?如果是这样,那么您就不需要迭代,您可以执行以下操作:

q){select from x where test}update test:(col2=`remove)&(>)prior rdn from B
rdn col2   test
---------------
6   remove 1
8   remove 1

编辑:或者如果它是您需要的running maximum,那么:

q)select from B where rdn=maxs rdn
rdn col2
----------
6   remove
8   remove

如果您的问题比您解释的更复杂,并且您确实必须遍历表格的每一行,那么您可以使用以下内容:

q)distinct{$[x[`rdn]<y`rdn;y;x]}\[B]
rdn col2
----------
6   remove
8   remove
© www.soinside.com 2019 - 2024. All rights reserved.