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

KDB:选择两个更新列对应的行,kdb,Kdb,考虑一下财务报价数据,在这些数据中,出价和出价并不总是同时得到更新。我只想选择出价和出价都反映新市场水平的行。在下表中,这将对应于选择行t1、t5、t7、t9。有什么优雅的方法吗?或者,我想排除t2、t3、t4行,它们对应于只有一个bid/ask更新的时间 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:([]

考虑一下财务报价数据,在这些数据中,出价和出价并不总是同时得到更新。我只想选择出价和出价都反映新市场水平的行。在下表中,这将对应于选择行t1、t5、t7、t9。有什么优雅的方法吗?或者,我想排除t2、t3、t4行,它们对应于只有一个bid/ask更新的时间

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 

我尝试了另一种方法,它花费的时间更少,但内存更多。详情如下:

步骤1:计算一个表,其中包含“ask”更改的行。然后从这个中间表中删除bid=previousbid的行

步骤2:计算一个表,其中包含“bid”更改的行。然后删除中间表中ask=previous ask的行。{从不同ask、bidprev bid的选项卡中选择}

步骤3:联接表1和表2

我使用了@terrylench示例中的表。我使用了实际时间值,因为我需要该列进行排序

     q)tab:([] time:.z.T+til 14;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)`time xasc distinct (select from tab where differ ask,bid<>prev bid) upsert (select from tab where differ bid,ask<>prev ask)
     q)tab:([] time:.z.T+til 14;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)`time xasc distinct (select from tab where differ ask,bid<>prev bid) upsert (select from tab where differ bid,ask<>prev ask)
time         bid ask
--------------------
10:45:02.530 12  13
10:45:02.535 13  14
10:45:02.538 13  15
10:45:02.540 14  16
10:45:02.541 13  15
10:45:02.543 14  16