【问题标题】:how to use multiple arguments in kdb where query?如何在 kdb where 查询中使用多个参数?
【发布时间】:2013-06-21 07:07:27
【问题描述】:

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

【问题讨论】:

    标签: kdb


    【解决方案1】:

    你可以试试这样的:

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

    【讨论】:

    • 这正是我想要避免的。如果我必须为 5、10、20、25、30、35....等等,这个解决方案并不理想
    • f有什么用?试过 f[(15 30 60 120)],它只是在单独的列中给出 4 个值,而不是我要找的。​​span>
    • 我意识到问题的原始范围已通过您的方法得到解答。已编辑以扩大问题的范围
    【解决方案2】:

    这可行,但需要很多时间。对于 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;
    

    【讨论】:

      【解决方案3】:

      这会构建一个步骤字典来将时间映射到您的存储桶:

      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
      

      【讨论】:

      • 同样,答案只返回 0930 之前的常量桶。我想对表中的所有行执行此操作。对于每次 x,我想计算 x+5、x+15、x+30... 分钟后的最高价格。
      猜你喜欢
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2021-08-22
      相关资源
      最近更新 更多