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

时间:2018-12-09 03:29:45

标签: 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天中的所有条目,其abschange> 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 个答案:

答案 0 :(得分:1)

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

  • 对于abschange> 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)