基于其他列添加列KDB+;

基于其他列添加列KDB+;,kdb,q-lang,Kdb,Q Lang,我有一个包含许多列的表(“ibmqt”),我想添加一个新列,其中包含布尔值,指示每行一列(“bid”)是否大于或等于另一列(“ask”) 迄今为止,我最成功的尝试是: ibmqt: update (pricecross:select bid>=ask from ibmqt) from ibmqt 但是,这会导致以下结果: time sym bid ask bsize asize pricecross --------------------------------

我有一个包含许多列的表(“ibmqt”),我想添加一个新列,其中包含布尔值,指示每行一列(“bid”)是否大于或等于另一列(“ask”)

迄今为止,我最成功的尝试是:

ibmqt: update (pricecross:select bid>=ask from ibmqt) from ibmqt
但是,这会导致以下结果:

time         sym bid   ask   bsize asize pricecross
----------------------------------------------------
00:00:59.063 IBM 43.53 43.57 10000 9000  (,`ask)!,0b
00:01:03.070 IBM 43.54 43.59 6500  3000  (,`ask)!,0b
00:02:31.911 IBM 43.56 43.6  500   4500  (,`ask)!,0b
00:03:43.070 IBM 43.56 43.56 10000 2500  (,`ask)!,1b
00:06:01.170 IBM 43.54 43.56 8500  4500  (,`ask)!,0b
00:06:11.081 IBM 43.56 43.58 500   1500  (,`ask)!,0b
00:08:15.126 IBM 43.55 43.57 1500  9000  (,`ask)!,0b
显然,在“pricecross”一栏中,我只想要0,0,0,1,0等等


有什么建议吗?

不需要嵌套选择。这将满足您的需要:

ibmqt:update pricecross:bid>=ask from ibmqt
或者您可以就地更新
ibmqt

update pricecross:bid>=ask from `ibmqt
q是一种数组语言,因此,
bid>=ask
成对比较两列并返回布尔值列表。这将说明以下观点:

1 2 3 >= 0 2 4 / 110b

布尔值列表随后被分配到一个新列
pricecross

,因为
=
被重载以处理atom和list,使用
pricecross:bid>=ask
是这里的最佳解决方案:

q)update pricecross:bid>=ask from ibmqt 
但有一种稍微不同的方法可以获得相同的结果:

q)update pricecross:bid>='ask from ibmqt 
q)update pricecross:>='[bid;ask] from ibmqt 
当并矢函数仅适用于原子时,这尤其有用:

q)update pricetolerance:tolerance'[bid;ask] from ibmqt