我想使用dbmaint包在hdb中的所有日期中添加一列,然后用从同一表中的另一个现有列中的数据回填到我添加的列中,直到所有日期为止。
我刚刚在所有日期中添加了带有默认值的列。如何用来自另一列的数据回填该列?我不确定如何实现。
答案 0 :(得分:4)
我认为您正在寻找copycol
中的dbmaint.q
函数。请注意,此功能不适用于嵌套列。
q)\l dbmaint.q
q)tables[]
`s#`depthsecond`quotessecond`tradessecond
q)tradessecond
date sym time src price size
------------------------------------------------------------
2018.07.16 AAPL 2018.07.16D08:00:00.078000000 N 25.32 1634
2018.07.16 AAPL 2018.07.16D08:00:03.419000000 O 25.35 1900
2018.07.16 AAPL 2018.07.16D08:00:03.504000000 O 25.32 627
2018.07.16 AAPL 2018.07.16D08:00:03.846000000 O 25.32 69
2018.07.16 AAPL 2018.07.16D08:00:07.177000000 O 25.32 4821
2018.07.16 AAPL 2018.07.16D08:00:07.373000000 O 25.35 2321
2018.07.16 AAPL 2018.07.16D08:00:11.861000000 L 25.33 545
q)
q)copycol[`:hdb2;`tradessecond;`price;`price_new]
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.16/tradessecond
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.17/tradessecond
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.18/tradessecond
q)\l hdb2
q)tradessecond
date sym time src price size price_new
----------------------------------------------------------------------
2018.07.16 AAPL 2018.07.16D08:00:00.078000000 N 25.32 1634 25.32
2018.07.16 AAPL 2018.07.16D08:00:03.419000000 O 25.35 1900 25.35
2018.07.16 AAPL 2018.07.16D08:00:03.504000000 O 25.32 627 25.32
2018.07.16 AAPL 2018.07.16D08:00:03.846000000 O 25.32 69 25.32
如您所见,tradessecond
表现在包含price_new
列。如果您的大小写不同(嵌套列,或者您不想复制示例中显示的列),则必须手动进行更新(遍历所有分区,向下保存列,更新{{1} }文件并在必要时枚举。
答案 1 :(得分:3)
根据Alex的解决方案-如果您想要与现有列完全相同,copycol
可以使用。
如果要从现有列创建派生的列,则还需要使用fncol
函数将lambda应用于该列。例如,创建价格列的副本,然后将新列中的所有价格翻倍:
copycol[`:hdb;`table;`price;`price_new];
fncol[`:hdb;`table;`price_new;{2*x}];
lambda不包含表中的任何其他信息,它仅包含来自要修改的列的值。
但是,如果您的派生列更高级,并且需要表中两个或更多列的数据,那么您将需要对vanilla dbmaint包进行一些修改,如下所示:
创建新版本的fncol,它将当前目录路径传递给函数
fncol2:{[dbdir;table;col;fn]
{fn1col[z;x;y@z]}[col;fn;]each allpaths[dbdir;table];};
然后,您可以在lambda中根据需要添加其他列,例如,如果要添加两个价格列:
{[path;vector] vector + get ` sv path,`otherPriceCol}
因此,总体而言,您的复制和修改命令为:
copycol[`:hdb;`table;`price;`price_new];
fncol2[`:hdb;`table;`price_new;{[path;vector] vector + get ` sv path,`otherPriceCol}];