我想在接下来的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是该行中的时间条目。
答案 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