选择q kdb历史数据库中除两列以外的所有列

选择q kdb历史数据库中除两列以外的所有列,kdb,Kdb,在输出中,我想从q/kdb历史数据库的表中选择除两列之外的所有列。 我试着运行下面的查询,但在hdb上不起作用 delete colid,coltime from table where date=.z.d-1 但它失败了,错误如下 ERROR: 'par (trying to update a physically partitioned table) 我提到但没有帮助。 如何在kdb历史数据库中显示除两列以外的所有列?可以尝试功能选择: ?[table;enlist(=;`date

在输出中,我想从q/kdb历史数据库的表中选择除两列之外的所有列。 我试着运行下面的查询,但在hdb上不起作用

delete colid,coltime from table where date=.z.d-1
但它失败了,错误如下

ERROR: 'par 
(trying to update a physically partitioned table)  
我提到但没有帮助。
如何在kdb历史数据库中显示除两列以外的所有列?

可以尝试功能选择:

?[table;enlist(=;`date;.z.d);0b;{x!x}cols[table]except`colid`coltime]
这里最后一个参数是列名到列标题的字典,它告诉查询要提取什么。这不会删除您指定的列,而是选择除这两个之外的所有列,这或多或少是同一个查询

要查看查询的功能形式,可以运行以下操作:

parse"select colid,coltime from table where date=.z.d"
它将把参数输出到函数select


<>你可以阅读更多关于../p>< P>你得到PAR错误的原因是因为它是一个分区表。

错误记录在案

您不能直接更新、删除分区表上的任何内容。对此,有单独的db维护脚本

作为修复程序使用的查询基本上是先在内存中临时选择数据,然后删除列,因此可以正常工作

delete colid,coltime from select from table where date=.z.d-1
您可以尝试以下函数形式:

c:cols[t] except `p
?[t;enlist(=;`date;2015.01.01) ;0b;c!c]

只有select查询对分区表有效,您可以通过构造查询来解决此问题,首先将表选择到内存中,然后删除不需要的列

如果您有大量的列,并且不想创建庞大的select查询,那么可以使用函数式select

?[table;();0b;{x!x}((cols table) except `colid`coltime)]
和显示除列子集以外的所有列。column子句需要一个字典,因此我使用函数{x!x}将我的列表转换为字典。请参阅此处的更多信息


正如nyi所提到的,如果要从历史数据库中永久删除列,可以使用dbmaint工具中的deleteCol函数

?[table;();0b;{x!x}((cols table) except `colid`coltime)]