如何按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];
关键逻辑说明
- 排序是核心前提:只有同
symbol/side/price的数据按时间排好序,prev time才能正确拿到前一行的时间戳。 - 分组标记:
(time - prev time) > 1000000生成布尔列,时间差超过1ms(KDB中timestamp的单位是纳秒,1ms=1000000纳秒)时为真。 - 生成分组ID:
sums[1b; ...]从第一行开始,每次遇到布尔值为真的行就累加分组ID,这样连续时间间隔≤1ms的行会被分配到同一个组。 - 聚合计算:最后按分组ID求和,取每组最大时间作为输出时间,和预期结果一致。
内容的提问来源于stack exchange,提问作者wbennasr
相关产品推荐
相关产品推荐

