KDB q запрос данных из одной таблицы на основе данных из другой таблицы без объединения - PullRequest
0 голосов
/ 28 июня 2018

Я новичок в 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.

Может ли кто-нибудь дать мне помощь по этим вопросам? Большое спасибо!

1 Ответ

0 голосов
/ 28 июня 2018

Я рекомендую организовать таблицу 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
...