【问题标题】:Kdb q query data from one table based on the data from another table without joinkdb q 根据另一张表中的数据查询一张表中的数据,无需连接
【发布时间】:2018-06-27 21:55:35
【问题描述】:

我是 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,它在不同的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 变量。

有人可以帮我解决这个问题吗?非常感谢!

【问题讨论】:

    标签: kdb


    【解决方案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
    

    【讨论】:

    • 非常感谢!这非常有帮助。由于原始表 t2 在 kdb 服务器中,因此 t2 上的更新命令会杀死服务器吗...?
    • t2表的meta是什么?您是将函数传递给服务器还是将数据带到本地 q 会话?
    • t2 表日期是否已分区、展开或存储为二进制?
    • 感谢您的回复!我现在无权访问数据,因此无法向您显示元数据...我使用 \l 将数据加载到本地 q 会话。而且我不是 100% 确定,但我认为 t2 表日期没有被分区和张开......
    • 该表的记录数是多少?如果它是服务器上的二进制表,那么运行更新命令应该没问题。请查看 kx wki 上的 aj 和 wj 函数,它解释了在使用连接时需要如何对数据进行排序以获得更快的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多