首页 文章

Kdb q根据来自另一个表而没有连接的数据从一个表中查询数据

提问于
浏览 696
0

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

我有两张 table . 表 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 ,它在 tp_time 处有很多 price . 因此表 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 回答

  • 2

    我建议通过应用适当的属性来组织表 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
    

相关问题