Kdb 把字典拼成一张桌子

Kdb 把字典拼成一张桌子,kdb,Kdb,当我使用相同的键连接字典时,我得到一个表: q)((`s`p!`s1`p1);(`s`p!`s2`p2)) s p ----- s1 p1 s2 p2 但是如果键不同,它只返回列表,有没有办法生成一个合适的表 q)((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2)) `s`p!`s1`p1 `s`p`m!`s2`p2`m2 您可以使用uj和副词over来获取表格: q)(uj)over enlist each ((`s`p!`s1`p1);(`s`p`m!`s2`p2

当我使用相同的键连接字典时,我得到一个表:

q)((`s`p!`s1`p1);(`s`p!`s2`p2))

s  p 
-----
s1 p1
s2 p2
但是如果键不同,它只返回列表,有没有办法生成一个合适的表

q)((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))

`s`p!`s1`p1
`s`p`m!`s2`p2`m2

您可以使用
uj
和副词
over
来获取表格:

q)(uj)over enlist each ((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))

s  p  m 
--------
s1 p1   
s2 p2 m2
请注意,在加入之前,我们首先将单个词典添加到表中

当有两个以上的词典时,上方的
特别有用。
否则,单独使用
uj
就可以做到这一点

q)(enlist `s`p!`s1`p1) uj (enlist `s`p`m!`s2`p2`m2)

s  p  m 
--------
s1 p1   
s2 p2 m2

另一个选项是使用take
#
使字典的键统一

q)`s`p`m#/:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
s  p  m
--------
s1 p1
s2 p2 m2
如果需要,可以使用类似于
(union/)key each
的方法将所有字典的键组合到一个唯一键列表中

q)((union/)key each d)#/:d:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
s  p  m
--------
s1 p1
s2 p2 m2
比较不同选项的执行时间和内存使用情况

q)\ts:1000 (uj)over enlist each ((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
53 2288
q)\ts:1000 `s`p`m#/:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))  
13 1920
q)\ts:1000 ((union/)key each d)#/:d:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
22 2880

所以最有效的方法当然是你知道所有可能的钥匙。但是如果您只想同时使用字典列表中的所有键,那么使用
#
仍然要快一点

但是这里的问题是take(#)不知道要符合什么数据类型。碰巧在这个例子中,所有的数据类型都是符号,所以数据类型是一致的。如果您有类似于
s
p
m/:(
s
p!
s1
p1);(
s
p
m!(
s2;
s3;1i)),那么第一个字典中的“m”将不会与第二个字典中的“m”具有相同的类型,除非是偶然的。uj方法将尽可能创建统一的数据类型