首页 文章

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

提问于
浏览
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)

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

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

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

  • 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;
    
  • 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
    

相关问题