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

如何按symbol、side、price汇总qty,且分组间隔≤1ms的time?

KDB 连续时间间隔分组求和问题

我有一张表t,包含symbol、side、price、time和qty列。需要按symbol、side、price对qty求和,同时将时间间隔≤1ms的连续行归为同一组,该如何实现?

示例

输入

symbol  side  time                                        price  qty  
--------------------------------------------------------  
x       1     2019.09.07D00:00:00.127000000   100    15  
x       1     2019.09.07D00:00:00.128000000   100    10  

预期输出

symbol  side  time                            price  qty  
--------------------------------------------------------  
x       1     2019.09.07D00:00:00.128000000   100    25

尝试过的错误解法

我尝试了以下方法但未成功,间隔1ms的时间仍被显示为单独行:

t:update ts_bucket:1000000 xbar time from sol;
res:select sum qty, time :max time by symbol,side,price,ts_bucket from t

正确解法

你用xbar的问题在于它是固定时间桶分组,会把时间严格划分到1ms的整数倍区间里——比如示例中127000000和128000000属于不同的桶,自然会分成两组。但你需要的是连续相邻行时间差≤1ms就合并为同一组,这属于会话分组逻辑,实现方式如下:

// 第一步:按symbol、side、price、time排序,确保同组数据按时间顺序排列
t_sorted: `symbol`side`price`time xasc t;

// 第二步:生成分组ID——同一symbol/side/price下,当前行与前一行时间差>1ms时标记为新组
t_grouped: update group_id: sums[1b; (time - prev time) > 1000000] by symbol`side`price from t_sorted;

// 第三步:按分组ID聚合求和,取每组最大时间作为输出时间
res: select sum qty, time: max time by symbol, side, price, group_id from t_grouped;

// 可选:移除不需要的group_id列,保留目标字段
res: res[`symbol`side`time`price`qty];

关键逻辑说明

  1. 排序是核心前提:只有同symbol/side/price的数据按时间排好序,prev time才能正确拿到前一行的时间戳。
  2. 分组标记:(time - prev time) > 1000000生成布尔列,时间差超过1ms(KDB中timestamp的单位是纳秒,1ms=1000000纳秒)时为真。
  3. 生成分组ID:sums[1b; ...]从第一行开始,每次遇到布尔值为真的行就累加分组ID,这样连续时间间隔≤1ms的行会被分配到同一个组。
  4. 聚合计算:最后按分组ID求和,取每组最大时间作为输出时间,和预期结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:58:26