You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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]:取分组内第二行的myType
  • myValue[0]:取分组内第一行的myValue
  • start.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:33:16