如何根据表中的前几行设置元id

  • 本文关键字:几行 设置 id 何根 kdb
  • 更新时间 :
  • 英文 :


当我写这个问题时,我想了一个方法来做,但看起来不是很"惯用的q;

考虑下表

S 123
t:`sym`time xasc ([]sym:100?10;time:100?100;price:100?10.0)

我想根据以下逻辑创建一个元id:如果sym与前一行相同,并且时间在20秒内,则重用前一行的id,否则将id增加1。

这是我的解决方案

f:{[acc;elem]
$[
(elem[`sym] ~ acc[`prevSym]) & 20 > elem[`time] - acc[`prevTime];
[
acc[`prevTime]:elem[`time];
acc
];
(`id`prevTime`prevSym)!(acc[`id]+1;elem[`time];elem[`sym])
]
}
update id: (exec id from ((`id`prevTime`prevSym)!(0;0;())) f t) from t

在过去有很多次,我问过一个关于q的问题,结果发现有一种非常优雅、简洁和高效的方法

我有最好的方法吗?

这也应该实现相同的效果:

update id:sums differ[sym]|20<=deltas time from t

窗口连接可能最接近您想要的惯用连接。

q)w:-20 0+:t.time
q)c:`sym`time
q)old:update id: (exec id from ((`id`prevTime`prevSym)!(0;0;())) f t) from t
q)new:update `long$sums id from wj[w;c;t;(update id:time from t;({not any -1_(last[x]-x)<20};`id))]
q)old~new
1b

编辑:刚刚意识到,尽管你在wj上玩得很开心,但你可以做一个aj,它可能会更快。类似于:

q)new:update id:`long$sums (time-id)>20 from aj[`sym`time;t;update id:time from t]

最新更新