Соедините две таблицы kdb на основе 1 точного значения и значения ближайшего времени - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть таблица mySe c.

Карта [сек] = срок действия фиксирован, т.е. для одного се c срок действия будет постоянно одинаковым.

time          sec  expiry           V1
----------------------------------------
09:25:01.012  100  2021.01.01     0.2032
09:25:16.012  104  2021.06.01     0.1952
09:25:31.026  106  2020.12.01     0.1625
09:25:46.032  111  2021.11.31     0.2625
09:26:01.012  110  2021.04.31     0.3625
09:26:16.048  104  2021.06.01     0.1955
09:26:31.027  106  2020.12.01     0.1629

У меня есть еще одна таблица с именем myParam

time          expiry        V2
----------------------------------------
09:25:01.007  2021.01.01     2.3
09:25:01.018  2021.12.01     2.8
09:25:15.025  2021.06.01     4.1
09:25:16.025  2021.06.01     4.0
09:25:31.012  2020.12.01     2.1
09:25:46.032  2021.04.31     2.2
09:25:46.059  2021.11.31     5.2
09:26:23.012  2021.04.31     1.9
09:26:58.012  2021.06.01     3.3
09:27:09.012  2020.12.01     3.5

Результатом под названием resTable должна быть таблица, основанная на том факте, что срок действия должен точно совпадать, а строка, выбранная в myParam, должна быть ближайшей к время в mySe c.

Например, если рассмотреть 6-ю строку в mySe c в момент времени = 09: 26: 16.048, его срок действия равен 2021.06.01, и для этого срока в myParam есть 3 ряда Из этих 3 строк я хочу выбрать строку с самым поздним временем, чтобы время <= 09: 26: 16.048. </p>

time          sec  expiry           V1     V2
-----------------------------------------------
09:25:01.012  100  2021.01.01     0.2032   2.3
09:25:16.012  104  2021.06.01     0.1952   4.1
09:25:31.026  106  2020.12.01     0.1625   2.1
09:25:46.032  111  2021.11.31     0.2625   NaN
09:26:01.012  110  2021.04.31     0.3625   2.2
09:26:16.048  104  2021.06.01     0.1955   4.0
09:26:31.027  106  2020.12.01     0.1629   2.1

Количество строк в resTable было бы таким же, как в mySe c , Мне все равно, если какой-то элемент V2 равен NaN или 0 или какому-либо другому значению.

Как мне добиться этого в q?

1 Ответ

4 голосов
/ 28 апреля 2020

Такое объединение может быть выполнено с использованием aj, которое принимает последнее / последнее значение за интервал. Ниже описано, как подать заявку на использование (с уточненными датами):

q)aj[`expiry`time;mySec;myParam]
time         sec expiry     V1     V2
--------------------------------------
09:25:01.012 100 2021.01.01 0.2032 2.3
09:25:16.012 104 2021.06.01 0.1952 4.1
09:25:31.026 106 2020.12.01 0.1625 2.1
09:25:46.032 111 2021.11.30 0.2625
09:26:01.012 110 2021.04.30 0.3625 2.2
09:26:16.048 104 2021.06.01 0.1955 4
09:26:31.027 106 2020.12.01 0.1629 2.1

Обратите внимание, что порядок столбцов важен, точное совпадение будет сделано для expiry и <= проверка выполнена по столбцам времени.

Кроме того, этот тип объединения будет более эффективным, если атрибуты будут правильно применены к вашей таблице. Это подробно обсуждается в aj документации на code.kx.com .

...