Kdb q在没有连接的情况下基于来自另一表的数据查询来自一个表的数据

时间:2018-06-27 21:55:36

标签: kdb

我是kdb / q的新手。以下是我的问题。真的希望kdb的专家可以帮助我。

我有两个桌子。表t1具有两个属性:tp_timeid,看起来像:

tp_time                   id
------------------------------
2018.06.25T00:07:15.822    1
2018.06.25T00:07:45.823    3
2018.06.25T00:09:01.963    8
...
...

t2具有三个属性:tp_timeidprice

对于每个id,在不同的price处有许多tp_time。因此,表t2确实很大,如下所示:

tp_time                   id      price
----------------------------------------
2018.06.25T00:05:99.999    1      10.87
2018.06.25T00:06:05.823    1      10.88
2018.06.25T00:06:18.999    1      10.88
...
...
2018.06.25T17:39:20.999    1      10.99 
2018.06.25T17:39:23.999    1      10.99
2018.06.25T17:39:24.999    1      10.99
...
...
2018.06.25T01:39:39.999    2      10.99 
2018.06.25T01:39:41.999    2      10.99
2018.06.25T01:39:45.999    2      10.99
...
...

我想做的是对表t1中的每一行,在最近的时间找到它的价格,在大约5秒后找到它的价格。例如,对于表t1中的第一行:

2018.06.25T00:07:15.822 1

最近时间的价格为10.87,大约5秒后的价格为10.88。我的预期输出表如下所示:

tp_time                   id   price_1      price_2
----------------------------------------------------
2018.06.25T00:07:15.822    1    10.87        10.88
2018.06.25T00:07:45.823    3    SOME_PRICE   SOME_PRICE
2018.06.25T00:09:01.963    8    SOME_PRICE   SOME_PRICE
...
...

问题是我无法加入t1t2,因为表t2太大,我将杀死服务器。我尝试过类似...where tp_time within(time1, time2)的操作。但是我不确定如何处理time1和time2变量。

有人可以在这个问题上给我一些帮助吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

我建议通过应用适当的属性来组织表t1,以便在您加入表时能够快速生成结果。

由于您要查找当时的价格和5秒钟后的价格,因此需要wj

一般语法是:

wj[w;c;t;(q;(f0;c0);(f1;c1))]

w-开始时间和结束时间
tq-未加密的表格; q应该由`id`time上的`p#id排序
c-要连接的列的名称
f0f1-聚合函数

在您的情况下,t2应该按`id`time`p#上的id进行排序

q)t2:update `g#id from `id`tp_time xasc ([] tp_time:`time$10:20:30 + asc -10?10 ; id:10?3 ;price:10?10.)
q)t1:([] tp_time:`time$10:20:30 + asc -3?5 ; id:1 1 1 )

q)select from t2 where id=1
tp_time         id  price
10:20:31.000    1   4.410662
10:20:32.000    1   5.473385
10:20:38.000    1   1.247049

q)wj[(`second$0 5)+\:t1.tp_time;`id`tp_time;t1;(t2;(first;`price);(last;`price))]

tp_time        id   price       price
10:20:30.000    1   4.410662    5.473385  
10:20:31.000    1   4.410662    5.473385
10:20:34.000    1   5.473385    1.247049   //price at 32nd second & 38th second