检索表中与where子句匹配的天之前10天的所有条目

  • 本文关键字:10天 检索 where 子句 kdb
  • 更新时间 :
  • 英文 :


我有一个随机的数据表,包含日期和数字:

Date                          Open       Volume        abschange
2016.12.08D00:00:00.000000000 11035.76   1.74835e+008  1.30177
2016.12.09D00:00:00.000000000 11170.18   1.0383e+008   0.2994598
2016.12.12D00:00:00.000000000 11198.42   8.98117e+007  0.07331357
...
2016.12.30D00:00:00.000000000 11443.31   4.18109e+007  0.3298871
2017.01.02D00:00:00.000000000 11426.38   4.74561e+007  1.504853

因此,从这个表中,我希望能够创建一个列表,其中包含日期前10天的所有条目,该列表的潜逃次数>1。

我认为从关注这些日期开始最容易:

Date                          abschange
---------------------------------------
2016.12.08D00:00:00.000000000 1.30177  
2017.01.02D00:00:00.000000000 1.504853 
2017.01.25D00:00:00.000000000 1.099709 
2017.01.31D00:00:00.000000000 1.344625 
2017.02.06D00:00:00.000000000 1.016427 
2017.02.21D00:00:00.000000000 1.265196

然后创建一个平面列表:

mynewdates: raze tablewithDateAndabschange each

这给了我:

2016.12.08D........ 2017.01.02D......

当我想为列表中的每个条目添加10个之前的日期时,我就陷入了困境。

我真的可以根据第一个表在一行代码中得到我想要的结果吗?还是应该按照我现在的路径?

对于两者——如果可能的话,可能的解决方案是什么?

如果我的理解是正确的,您的要求是:

  • 对于潜逃>1的每个日期,从表中获取该日期之前的最后10个日期

下面的查询将创建该映射。它基于以下假设:

  • 日期列是唯一的,并且按照示例中显示的顺序(升序(排列

如果上述条件不成立,则需要对下面的查询进行细微的更改才能处理重复和无序列表。

  • 表未设置键。

    q) (tbl[`Date]a)!b@'where@'not null b:tbl[`Date] -1+(a:where 1<tbl`abschange)-:til 10
    

更新:基于评论部分的讨论。

只需添加第二步来检查第一个结果的日期列表是否为空。在这种情况下,从该日期生成最后10个日期。

最后,它生成一个表,其中每一行都包含每个日期的前一个日期(最大10个(,其中abschange>1。

q)d:b@'where@'not null b:tbl[`Date] -1+(a:where 1<tbl`abschange)-:til 10
q)d[0]:$[0=count d 0;(t[`Date]a 0)-1+til 10;d 0]
q)([]dates:d)

最新更新