如何在kdb中使用多个参数查询?

时间:2013-06-21 07:07:28

标签: kdb

我想在接下来的5,10,30分钟等内从表中选择最大元素。 我怀疑在where子句中有多个元素是不可能的。 使用普通<</:都失败了。我的代码/查询如下:

`select max price from dat where time</: (09:05:00; 09:10:00; 09:30:00)`

任何想法我在这里做错了什么? 我们的想法是在该行的下一个5,10,30分钟内获得每行的最高价格,而不是整个表格中的3个最高价格。

select max price from dat where time</: time+\:(5 10 30)

这不起作用,但应该给出一般的想法。

为了进一步说明,我想从表格的每一行的时间[i]开始计算5,10,30分钟的最大价格。因此,对于x + 5,x + 10,x + 30分钟内的每个表格行最高价格,其中x是该行中的时间条目。

3 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

select c1:max price[where time <09:05:00],c2:max price[where time <09:10:00],c3:max price from dat where time< 09:30:00

您可以随心所欲地对此查询进行语法表达。所以如果你有一个时间列表,l:09:05:00 09:10:00 09:15:00 09:20:00 ...你可以使用上面查询的功能形式创建一个函数来工作不同长度的l,类似于:

q)f:{[t]?[dat;enlist (<;`time;max t);0b;(`$"c",/:string til count t)!flip (max;flip (`price;flip (where;((<),/:`time,/:t))))]}
q)f l

您可以扩展f以使用不同的函数而不是max,适用于不同的表等。

答案 1 :(得分:0)

这可行,但需要花费很多时间。对于20k记录,大约20秒,太多了!任何使其更快的方法

 dat: update tmlst: time+\:mtf*60 from dat;
 dat[`pxs]: {[x;y] {[x; ts] raze flip raze {[x;y] select min price from x where time<y}[x] each ts }[x; y`tmlst]} [dat] each dat;

答案 2 :(得分:0)

这构造了一个步骤字典来将时间映射到你的桶:

q)-1_select max price by(`s#{((neg w),x)!x,w:(type x)$0W}09:05:00 09:10:00 09:30:00)time from dat

您也可以 ab 使用wj

q)wj[{(prev x;x)}09:05:00 09:10:00 09:30:00;`time;([]time:09:05:00 09:10:00 09:30:00);(delete sym from dat;(max;`price))]

如果你的所有水桶都是相同的尺寸,那就容易多了:

q)select max price by 300 xbar time from dat where time<09:30:00 / 300-second (5-min) buckets