如何从表中删除多个列?

时间:2017-10-15 18:26:30

标签: kdb q-lang

因此有delete col from table删除单个列。我想我可以使用over删除多个列。但是:

  • 我不确定这是否有效。

  • 我不太确定如何在这里正确使用。这样的事情不起作用:{delete y from x}/[t;`name`job]

3 个答案:

答案 0 :(得分:3)

您可以使用与选择多列相同的方式删除多个列。

delete col1,col2 from table

在这种情况下使用它肯定会效率低下。

但是,您可能希望将列名作为符号传递给执行select或delete的函数。

为此,需要使用delete的功能形式:https://code.kx.com/q/ref/funsql/

功能删除的例子

q)table:([]col1:1 2 3;col2:1 2 3;col3:10 20 30) 
q)//functional delete
q){![table;();0b;x]} `col1`col2
col3
----
10  
20  
30  
q)//inplace functional delete
q){![`table;();0b;x]} `col1`col2
`table
q)table
col3
----
10  
20  
30 

答案 1 :(得分:3)

对于内存中的表格,您还可以使用drop:http://code.kx.com/q/ref/lists/#_-drop

q)((),`col1)_table
col2 col3
---------
1    10
2    20
3    30
q)((),`col1`col3)_table
col2
----
1
2
3
q)((),`)_table
col1 col2 col3
--------------
1    1    10
2    2    20
3    3    30

答案 2 :(得分:0)

我不能在etc211的解决方案下面发表评论,所以我刚开始另一个答案。

Hmm, functional delete doesn't seem to work when the list of columns is empty. I'd expect that not to touch the table at all, and yet it deletes all the rows in it instead. 

对于上述内容,为什么不创建一个选择您愿意删除的列的函数?

让我们假设你的表t包含列名:col1,col2,col3,col4 并且您要删除:col5,col6

来自q代码的

tgt_cols:`col5`col6;
filtered_cols: (cols t) inter tgt_cols;
if[0 < count filtered_cols;
    {![`t;();0b;x]} filtered_cols];

上面将首先检查是否存在要删除的列;如果存在目标列到删除,它将删除这些列。