2

我目前只是在时间戳前 1 分钟提取所有记录(例如,如果我感兴趣的时间戳是2014.04.14T09:30):

select from Prices where timestamp within 2014.04.14T09:29 2014.04.14T09:30, stock=`GOOG

然而,这显然不是很稳健。有时上一条记录可能在09:25am,然后查询什么也不返回。有时,如果价格变化很大,查询可能会返回数百条记录,即使我只需要返回最后一条记录。

我知道这可以通过 asof join 来完成,但暂时想避免它,因为它Prices目前太大了。

我也有兴趣做同样的事情,但在给定时间戳之后找到第一条记录。

另请注意,这Prices是一张张开的桌子

4

3 回答 3

3

选择给定时间戳之前的最后一条记录:

q)select from Price where stock=`GOOG,i=last i,timestamp<2014.04.14T09:30

选择给定时间戳之后的第一条记录:

q)select from Price where stock=`GOOG,i=first i,timestamp>2014.04.14T09:30
于 2014-04-14T10:41:17.103 回答
2

使用asoforaj来获得 kdb+ 众所周知的性能。价格越大,这样做的理由就越多。

我会质疑你避免的逻辑ajajasof使用bin二进制搜索运算符,因此比扫描时间戳列更高效。

让我们创建您的表并从另一个答案运行解决方案:

Prices:([]stock:`g#1000000?`GOOG,9?`4;timestamp:asc 2014.04.14+1000000?0t;price:1000000?100f,size:1000000?100j)
q)\t do[1000;select from Prices where timestamp<2014.04.14T09:30,stock=`GOOG,i=last i]
10205

我们可以通过重新排序约束来改善这一点:

q)\t do[1000;select from Prices where stock=`GOOG,timestamp<2014.04.14T09:30,i=last i]
2030

但没有什么能比得上这个:

q)\t do[1000;Prices asof `stock`timestamp!(`GOOG;2014.04.14D09:30)]
9

顺便说一句,您在问题中使用了日期时间,该问题已被弃用,因此我已将其替换为时间戳。这对性能没有影响。

于 2014-04-19T16:03:03.027 回答
0

使用时要记住的几件事aj

  • 内存价格 - 表格应该在`g#sym其中time排序sym
  • 磁盘上的价格 -`p#symtime在其中排序sym

同样在分区/展开表的情况下,使用where约束(date日期分区表中的约束除外)会严重影响性能。

于 2018-06-26T20:16:26.553 回答