我目前只是拉入时间戳之前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
是splayed表
发布于 2014-04-14 18:41:17
选择给定时间戳之前的最后一条记录:
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-20 00:03:03
使用asof
或aj
来获得kdb+众所周知的性能。价格越高,这样做的理由就越多。
我会质疑你避免使用aj
的逻辑。aj
和asof
使用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
顺便说一下,您在问题中使用了datetime,但已弃用,因此我将其替换为timestamp。这对性能没有影响。
发布于 2018-06-27 04:16:27
使用aj
时需要记住的几件事
sym
内按`g#sym
和time
排序- `p#sym
和time
按价格排序
此外,对于分区/展开的表,使用where
约束(日期分区表中的date
除外)会严重影响性能。
https://stackoverflow.com/questions/23055509
复制相似问题