如何在kdb + / q中从带有列表的表中选择列的子集?

ben*_*man 7 kdb

给出下表:

time     | col1  col2  col3  ...
--------------------------------
10:53:02 | 89    89    76    ...
...
Run Code Online (Sandbox Code Playgroud)

如何从该表中选择由列名​​称列表引用的列的子集(包括索引),即cols:('col1';'col3'); 预期结果将是:

time     | col1  col3
----------------------
10:53:02 | 89    89   
...
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 5

您可以将 take (#) 关键字与 each right (/:) 副词一起使用。所以 q 将从表 t 中获取 sym 和 price 列的子集,并返回一个包含您的键和所需数据子集的表

q)t:([time:.z.z+ 1 2];sym:`a`b;price:10 20;vol:30 40)
q)c:`sym`price
q)c#/:t
time                   | sym price
-----------------------| ---------
2019.09.05T07:56:36.069| a   10
2019.09.06T07:56:36.069| b   20
Run Code Online (Sandbox Code Playgroud)


Rah*_*hul 3

有几种方法可以做到这一点:

q) t:([time:.z.z+ 1 2];sym:`a`b;price:10 20;vol:30 40)
Run Code Online (Sandbox Code Playgroud)

输出中所需的列:

q) c:`sym`price  
Run Code Online (Sandbox Code Playgroud)

将表键列添加到上面的列表中:

q) c:keys[t],c
Run Code Online (Sandbox Code Playgroud)

使用功能选择:

q) keys[t] xkey ?[`t;();0b;c!c]
Run Code Online (Sandbox Code Playgroud)

使用 Take(#) 运算符

q) keys[t] xkey c#0!t
Run Code Online (Sandbox Code Playgroud)

输出:

time                   | sym price
-----------------------| ---------
2019.09.04T23:05:21.577| a   10
2019.09.05T23:05:21.577| b   20
Run Code Online (Sandbox Code Playgroud)