0

我有一个随机的数据表 - 带有日期和数字:

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 个之前的日期时。

我真的可以根据第一个表在一行代码中得到我想要的结果,还是我应该遵循我所在的路径?

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

4

1 回答 1

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)
于 2018-12-09T10:05:03.110 回答