首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在KDB中选择给定时间戳之前/之后的第一条记录?

如何在KDB中选择给定时间戳之前/之后的第一条记录?
EN

Stack Overflow用户
提问于 2014-04-14 16:35:03
回答 3查看 3K关注 0票数 2

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

代码语言:javascript
复制
select from Prices where timestamp within 2014.04.14T09:29 2014.04.14T09:30, stock=`GOOG

然而,这显然不是很健壮。有时,前一条记录可能位于09:25am,然后查询将不返回任何内容。有时,如果价格发生了很多变化,查询可能会返回数百条记录,即使我只需要返回最后一条记录。

我知道使用asof join可以做到这一点,但我想暂时避免它,因为目前Prices太大了。

我也有兴趣做同样的事情,但我想找出之后的第一个记录

另请注意,Prices是splayed表

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-14 18:41:17

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

代码语言:javascript
复制
q)select from Price where stock=`GOOG,i=last i,timestamp<2014.04.14T09:30

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

代码语言:javascript
复制
q)select from Price where stock=`GOOG,i=first i,timestamp>2014.04.14T09:30
票数 3
EN

Stack Overflow用户

发布于 2014-04-20 00:03:03

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

我会质疑你避免使用aj的逻辑。ajasof使用bin运算符,这是一种二进制搜索,因此比扫描时间戳列更有效。

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

代码语言:javascript
复制
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

我们可以通过重新排序约束来使它变得更好:

代码语言:javascript
复制
q)\t do[1000;select from Prices where stock=`GOOG,timestamp<2014.04.14T09:30,i=last i]
2030

但没有什么能胜过这一点:

代码语言:javascript
复制
q)\t do[1000;Prices asof `stock`timestamp!(`GOOG;2014.04.14D09:30)]
9

顺便说一下,您在问题中使用了datetime,但已弃用,因此我将其替换为timestamp。这对性能没有影响。

票数 2
EN

Stack Overflow用户

发布于 2018-06-27 04:16:27

使用aj时需要记住的几件事

  • in-memory prices该表应在sym

内按`g#symtime排序- `p#symtime按价格排序

此外,对于分区/展开的表,使用where约束(日期分区表中的date除外)会严重影响性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23055509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档