如何将列表的每个元素与另一个列表的每个元素左连接

时间:2019-04-02 16:57:19

标签: kdb

我有2个列表,每个列表包含50个表。每个列表中的每个表都有一个名为ID ...

的列。
count list1
50
count list2
50

我希望能够对列表中的每个表进行左联接,将其与第二个列表中的每个表进行左联接(使用ID列作为键列),然后保存每个结果为每个联接加入一个单独的变量。

我可以通过执行以下操作单独对每个表执行左联接(以索引27的表为例)。这样可以使该表在第27个索引处获得期望的结果...

table27:list1[27] lj `ID xkey list2[27]

在下一组表上执行相同操作之前,如何遍历表列表,将每个表按其各自的索引连接并将该连接的表存储到变量中?

到目前为止,要加入表格,我已经尝试了以下方法...

joinedLists:each list1 lj `ID xkey each list2
joinedLists:(each list1) lj `ID xkey each list2
joinedLists:(each list1) lj' `ID xkey each list2
joinedLists:lj/[(each list1;each list2)]
joinedLists:lj/'[(each list1;each list2)]
joinedLists:list1[1+til 51] lj `ID xkey list2[1+til 51]

尽管上述所有查询(最后一个查询除外)都会导致错误的错误消息'。我尝试的最后一个查询给出了结果,但是在进一步检查该列表中的表时,它缺少一列并且计数不是预期的...

count each list1
913930 799359 53212 20 70 6 116 8 139 16 74 28 3 69 11 137 6 22 42 123 5 23 16 1 13 26 26 9 93 11 2 1 2 2 14 2 1 15 3 11 25 7 4 3 1 2 6 9 1 2 1
count each list2
274506 440675 44935 20 70 6 101 6 138 15 71 27 3 63 10 133 6 21 42 123 3 16 11 1 12 25 26 13 92 10 2 1 2 2 14 2 1 15 3 11 25 7 4 3 1 2 6 30 1 2 1
count each joinedLists
799410 53263 71 121 57 167 59 190 67 125 79 54 120 62 188 57 73 93 174 56 74 67 52 64 77 77 60 144 62 53 52 53 53 65 53 52 66 54 62 76 58 55 54 52 53 57 60 52 53 52 51

2 个答案:

答案 0 :(得分:5)

下面的示例在每个列表中都有两个表:

q)list1:(([]ID:1 2 3;b:4 5 6);([]ID:6 7 8;b:9 10 11))
q)list2:(([]ID:1 2 3;b:14 15 16);([]ID:6 7 8;b:19 20 21))
q){[t1;t2] list3,:enlist t1 lj `ID xkey t2}'[list1;list2];
q)list3
+`ID`b!(1 2 3;14 15 16)
+`ID`b!(6 7 8;19 20 21)

这两个(')均用于逐项将函数应用于两个列表。

,:用于全局加入每个应征结果并分配给变量list3

答案 1 :(得分:0)

如果您的ID列始终排在首位,这也应该起作用:

q)list1 lj'1!'list2
+`ID`b!(1 2 3;14 15 16)
+`ID`b!(6 7 8;19 20 21)