根据 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.
中对此进行了详细讨论
我有一个名为 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.