KDB:选择对应于两个更新列的行

标签 kdb

考虑出价和要价并不总是同时更新的金融报价数据。我只想选择出价和要价都反射(reflect)新市场水平的行。在下表中,这对应于选择行 t1、t5、t7、t9。这样做有什么优雅的方法吗? (或者,我想排除 t2、t3、t4 行,它们对应于只有一个出价/要价被更新的时间)。

time bid ask
t1 12 13
t2 12 14
t3 12 14
t4 12 14
t5 13 14
t6 13 14
t7 14 15
t8 14 15
t9 13 14

最佳答案

这应该可以解决问题(还没有大量测试)

tab:([] time:`t1`t2`t3`t4`t5`t6`t7`t8`t9;bid:12 12 12 12 13 13 14 14 13;ask:13 14 14 14 14 14 15 15 14)

q)select from tab where differ {$[all x<y;y;x]}\[flip sums each differ each (bid;ask)]
time bid ask
------------
t1   12  13 
t5   13  14 
t7   14  15 
t9   13  14 

Another example which contains more edge cases:

tab:([] time:`g`b`b`b`b`g`b`b`g`b`g`g`b`g;bid:12 12 12 12 12 13 13 14 13 13 14 13 14 14;ask:13 13 14 15 14 14 14 14 15 16 16 15 15 16)

q)select from tab where differ {$[all x<y;y;x]}\[flip sums each differ each (bid;ask)]
time bid ask
------------
g    12  13 
g    13  14 
g    13  15 
g    14  16 
g    13  15 
g    14  16 

可能有一种更简洁的方法,但我现在会测试这种方法。

编辑:求和后进行翻转更有效 - 上面已更改。

我看过的一种以前的方法只使用了每列不同的 bool 值。这种方法可行(并且可能更直观),但在时间和内存方面效率较低,因此我会坚持采用与上述第一种方法接近的方法。

scanner:{if[all x;x:not x];$[(y&z)|(x[0]&z)|x[1]&y;11b;x|(y;z)]}

q)select from tab where all each scanner\[00b;differ bid;differ ask]
time bid ask
------------
t1   12  13
t5   13  14
t7   14  15
t9   13  14

关于KDB:选择对应于两个更新列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25246750/

相关文章:

kdb - 如何对表中包含的值列表进行一致求和?

KDB\Q : How to run an iterative union join from within a ticker function?

java - 实现等待和通知

linux - 如何在 Windows 中获取 CSV 文件中的可变列数?

database - 查询KDB中的多个表

matrix - kdb 矩阵函数改进

kdb - 如何将此 select 语句转换为函数形式?

kdb - 使用结果中的列在 KDB 中创建表

kdb - 将 "Sum"行添加到表中

kdb - 如何显示 KDB 行大小?