4

我想在接下来的 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)

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

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

4

3 回答 3

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,适用于不同的表等。

于 2013-06-21T13:02:14.280 回答
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;
于 2013-06-22T07:00:16.767 回答
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

您也可以使用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
于 2013-06-27T21:35:42.413 回答