asof(aj)的加入严格少于KDB / Q中的加入

时间:2019-02-10 00:26:58

标签: q kdb

我有一个报价表和一个交易表,想列出报价表并加入严格小于该交易时间戳的时间戳匹配的交易表。

例如:

    q:([]time:10:00:00 10:01:00 10:01:00 10:01:02;sym:`ibm`ibm`ibm`ibm;qty:100 200 300 400)
    t:([]time:10:01:00 10:01:00 10:01:02;sym:`ibm`ibm`ibm;px:10 20 25)
    aj[`time;q;t]

返回

+------------+-----+-----+----+
|     time   | sym | qty | px |
+------------+-----+-----+----+
|   10:00:00 | ibm | 100 |    |
|   10:01:00 | ibm | 200 | 20 |
|   10:01:00 | ibm | 300 | 20 |
|   10:01:02 | ibm | 400 | 25 |
+------------+-----+-----+----+

但是我试图得到这样的结果:

+------------+-----+-----+----+
|     time   | sym | qty | px |
+------------+-----+-----+----+
|   10:00:00 | ibm | 100 |    |
|   10:01:00 | ibm | 100 | 10 |
|   10:01:00 | ibm | 100 | 20 |
|   10:01:02 | ibm | 300 | 25 |
+------------+-----+-----+----+

是否存在可以根据严格小于时间(而不是时间)的时间戳进行匹配的联接函数?

2 个答案:

答案 0 :(得分:0)

我认为的一种“黑客”方式是将所有交易转移至执行aj的最小时间单位,然后再回退

答案 1 :(得分:0)

我认为,如果您对aj[`time;q;t]进行了一些修改,那么您将无法修改qty列,因为表t不包含该列。相反,您可能需要使用更多的“传统” aj[`time;t;q]

q)@[;`time;+;00:00:01]aj[`time;@[t;`time;-;00:00:01];q]
time     sym px qty
-------------------
10:01:00 ibm 10 100
10:01:00 ibm 20 100
10:01:02 ibm 25 300

这会转移时间以避免匹配相等的时间,但是在开始时每个引号都不包含一行。

我认为,如果您希望将交易加入报价,而不是像我已经做过的那样将报价加入交易中,则可能需要考虑一些区分示例中同时发生的两个交易的方法。一种执行此操作的方法可能是使用它们到达的顺序,即将第一个报价匹配到第一个交易。

相关问题