如何基于kdb+表中各订单ID的最后两行比较新增列?
解决kdb+中按orderID比较最后两行并新增列的长度错误问题
问题原因
你用next函数导致了长度不匹配错误:每个orderID分组有2行数据,next[myType]会返回1个元素(去掉分组内最后一行),但myValue="0"是2个元素,两者做and运算时因长度不一致触发报错。
解决方案
因为每个分组固定是2行(最后两条记录),直接通过索引取分组内的对应行数据来判断条件即可,无需用next。
方案1:给每个orderID的两行都设置相同的结果
如果需要每个orderID的两条记录都显示同一个didEventHappen值,可使用fby在分组内计算:
/ 先获取每个orderID的最后两行(简化原代码) myResult: select from myTable where i in -2#i fby orderID; / 新增判断列 update didEventHappen: { myType[1] = `TYPE_A and myValue[0] = "0" and start.time[1] - end.time[0] > 00:00:01.000 } fby orderID from myResult;
myType[1]:取分组内第二行的myTypemyValue[0]:取分组内第一行的myValuestart.time[1] - end.time[0]:计算第二行开始时间与第一行结束时间的差值
方案2:仅在第二行显示判断结果
如果只需要在每个orderID的第二条记录显示结果,第一条设为0b:
update didEventHappen: { cond: myType[1] = `TYPE_A and myValue[0] = "0" and start.time[1] - end.time[0] > 00:00:01.000; (0b; cond) / 第一行设为0b,第二行设为判断结果 } fby orderID from myResult;
可选:过滤单条记录的orderID
如果存在仅含1条记录的orderID,可先过滤避免索引越界:
/ 筛选出至少有2条记录的orderID validOrders: select orderID from (select count i by orderID from myTable) where count >=2; / 再获取这些orderID的最后两行 myResult: select from myTable where orderID in validOrders.orderID, i in -2#i fby orderID;
内容的提问来源于stack exchange,提问作者abhi
相关产品推荐
相关产品推荐

