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

如何在KDB+ Q中按规则生成Run-ID迭代列?

问题描述

现有如下KDB+数据表:

t:([] A:99 99 99 99 99 99 99 99 99 99 99 80 80 80; B:`newcol`newcol`newcol`newcol`newcol`newcol`newcol`newcol`newcol`newcol`newcol`newcol2`newcol2`newcol; Run:`Start`Start`Start`During`During`End`End`End`Start`During`End`Start`End`End)

表格展示:

ABRun
99newcolStart
99newcolStart
99newcolStart
99newcolDuring
99newcolDuring
99newcolEnd
99newcolEnd
99newcolEnd
99newcolStart
99newcolDuring
99newcolEnd
80newcol2Start
80newcol2End
80newcolEnd

需要生成Run-ID列,规则如下:

  • 一个Run以Start开头,以End结尾;
  • 同一A列值下,开头连续的Start属于同一Run,ID保持一致直到Run结束;
  • 仅在End之后出现Start时才生成新ID,连续End时ID保持不变。

期望结果:

ABRunRun-ID
99newcolStart99-1
99newcolStart99-1
99newcolStart99-1
99newcolDuring99-1
99newcolDuring99-1
99newcolEnd99-1
99newcolEnd99-1
99newcolEnd99-1
99newcolStart99-2
99newcolDuring99-2
99newcolEnd99-2
80newcol2Start80-1
80newcol2End80-1
80newcolEnd80-1
解决方案

可以通过KDB+的分组、累计计数和填充逻辑实现,代码如下:

// 按A分组处理每组的Run序列,生成Run-ID列
update Run-ID:string[A],"-",string each {
    // 标记新Run的触发点:前一行是End且当前是Start,或分组首行是Start
    flag:0b, (prev x)=`End, x=`Start;
    // 累计生成Run编号,仅在触发点处递增
    runNum:scan {y+1f*z} 1f, flag[1:];
    // 向下填充编号,确保后续行继承当前Run的ID
    fill runNum
}[Run] by A from t

执行上述代码后,即可得到符合要求的结果表。

逻辑解释
  1. 分组隔离:通过by A按唯一标识符分组,保证每个A的Run序列独立计算ID;
  2. 触发点标记:生成flag序列,精准定位需要开启新Run的位置——仅当End之后出现Start,或是分组内第一个Start时标记为真;
  3. 编号累计:用scan对标记序列进行累计计数,每次遇到触发点时编号加1,其他位置保持当前编号;
  4. 填充补全:使用fill函数将编号向下传递,确保During阶段和连续的End阶段都继承当前Run的编号;
  5. 格式拼接:将A的字符串形式与Run编号拼接成A-N的格式,得到最终的Run-ID。

内容的提问来源于stack exchange,提问作者user21142340

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:10:39