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

时间:2018-08-10 06:20:10

标签: kdb

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

delete colid,coltime from table where date=.z.d-1

但失败并显示以下错误

ERROR: 'par 
(trying to update a physically partitioned table)  

我推荐了https://code.kx.com/wiki/Cookbook/ProgrammingIdioms#How_do_I_select_all_the_columns_of_a_table_except_one.3F,但没有帮助。
如何在kdb历史数据库中显示除两列以外的所有列?

4 个答案:

答案 0 :(得分:2)

可以尝试功能选择:

?[table;enlist(=;`date;.z.d);0b;{x!x}cols[table]except`colid`coltime]

最后一个参数是列名到列名的字典,它告诉查询要提取的内容。除了删除指定的列外,它不会选择其余的全部,而是选择全部相同或更少的两个查询。

要查看查询的功能形式是什么,您可以运行以下命令:

parse"select colid,coltime from table where date=.z.d"

并且它将参数输出到功能选择。

您可以在functional selectscode.kx.com上阅读更多内容。

答案 1 :(得分:2)

出现par错误的原因是由于它是分区表。

已记录错误here

 trying to update a partitioned table 

您不能直接updatedelete分区表上的任何内容(有单独的数据库维护脚本)

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

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]

答案 2 :(得分:2)

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

如果您有大量的列并且不想创建庞大的选择查询,则可以使用功能选择。

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

并显示所有列除了的子集。 column子句需要字典,因此我正在使用函数{x!x}将列表转换为字典。在此处查看更多信息

https://code.kx.com/q/ref/funsql/

答案 3 :(得分:2)

如nyi所述,如果您要从历史数据库中永久删除列,则可以使用dbmaint工具https://github.com/KxSystems/kdb/blob/master/utils/dbmaint.md中的deleteCol函数