我是kdb / q的新手。以下是我的问题。真的希望kdb的专家可以帮助我。
我有两个桌子。表t1
具有两个属性:tp_time
和id
,看起来像:
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_time
,id
和price
。
对于每个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
...
...
问题是我无法加入t1
和t2
,因为表t2
太大,我将杀死服务器。我尝试过类似...where tp_time within(time1, time2)
的操作。但是我不确定如何处理time1和time2变量。
有人可以在这个问题上给我一些帮助吗?非常感谢!
答案 0 :(得分:1)
我建议通过应用适当的属性来组织表t1
,以便在您加入表时能够快速生成结果。
由于您要查找当时的价格和5秒钟后的价格,因此需要wj。
一般语法是:
wj[w;c;t;(q;(f0;c0);(f1;c1))]
w
-开始时间和结束时间
t
和q
-未加密的表格; q应该由`id`time
上的`p#
和id
排序
c
-要连接的列的名称
f0
,f1
-聚合函数
在您的情况下,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