在输出中,我想从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历史数据库中显示除两列以外的所有列?
答案 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 selects的code.kx.com上阅读更多内容。
答案 1 :(得分:2)
出现par
错误的原因是由于它是分区表。
已记录错误here
trying to update a partitioned table
您不能直接update
,delete
分区表上的任何内容(有单独的数据库维护脚本)
您用作修复程序的查询基本上是先在内存中(临时)选择数据,然后再删除列,因此它可以正常工作。
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}将列表转换为字典。在此处查看更多信息
答案 3 :(得分:2)
如nyi所述,如果您要从历史数据库中永久删除列,则可以使用dbmaint工具https://github.com/KxSystems/kdb/blob/master/utils/dbmaint.md中的deleteCol
函数