根据 1 个精确值和最接近的时间值连接两个 kdb 表

Join two kdb tables based on 1 exact value and closest time value

我有一个名为 mySec 的 table。

Map[sec] = 到期时间是固定的,即一秒内到期时间将始终相同。

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

我还有另一个 table 叫做 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 的结果应该是 table,基于到期时间应该完全匹配并且在 myParam 中选择的行应该最接近 mySec 中的时间这一事实。

例如如果在 time=09:26:16.048 考虑 mySec 中的第 6 行,它的到期时间是 2021.06.01,对于 myParam 中的这个到期时间,有 3 行。在这 3 行中,我想选择时间最晚的行,这样时间 <= 09:26:16.048.

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 中的行数将与 mySec 中的行数相同。我不在乎 V2 的某些元素是 NaN 还是 0 或其他值。

如何在 q 中实现这一点?

可以使用 aj 来完成这种连接,它在一个区间内采用 last/most 最近的值。以下是如何申请您的用例(日期已清理):

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 上进行完全匹配,并在时间列上进行 <= 检查。

此外,如果在您的 table 上正确应用属性,这种类型的连接会更有效。 aj documentation on code.kx.com.

中对此进行了详细讨论