(KDB/Q+)更新简单表的前N行
我在KDB中有一个简单的表,我想知道是否有一种优雅的方法来更新前N行并设置所有的值 到0n,而不显式指定每个列名,因为我事先不知道有多少列 待决条件:[]c1:1+10;c2:1+10;c3:1+至10 我可以使用select[10]从t中选择前N行,但我不太确定如何更新前N行 非常感谢您的帮助 编辑 看到了@Jorge Sawyer的回复,但并不真正理解代码所做的足以自己修改它的事情。因此,需要帮助对以下日期键控表执行相同操作:(KDB/Q+)更新简单表的前N行,kdb,Kdb,我在KDB中有一个简单的表,我想知道是否有一种优雅的方法来更新前N行并设置所有的值 到0n,而不显式指定每个列名,因为我事先不知道有多少列 待决条件:[]c1:1+10;c2:1+10;c3:1+至10 我可以使用select[10]从t中选择前N行,但我不太确定如何更新前N行 非常感谢您的帮助 编辑 看到了@Jorge Sawyer的回复,但并不真正理解代码所做的足以自己修改它的事情。因此,需要帮助对以下日期键控表执行相同操作: tbl2:[日期:2021.01.01+til 10]c1:1.
tbl2:[日期:2021.01.01+til 10]c1:1.1+til 10;c2:1.1+直至10;c3:1.1+直到10您可以使用以下内容:
q)tbl:([] c1:1+til 10; c2:1+til 10; c3:1+til 10);
q)nullTopN:{[tbl;n]![tbl;enlist(<;`i;n);0b;{x!count[x]#0N}cols[tbl]]};
q)nullTopN[tbl;3]
c1 c2 c3
--------
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
10 10 10
nullTopN将遇到类型错误,因为tbl2现在有日期和浮动。我将使用prev来获取适当类型的null值,而不是过度工程化地强制转换null
f:{[tbl;n]
//[table;where;by;cols]
![tbl;enlist(<;`i;n);0b;
cols[tbl]!{[n;c] (#;n;(prev;(enlist;(first;c))))}[n] each cols[tbl]] }
/
This is equivalent to the below update query but for all columns by creating the dynamic functional update above:
update n#prev enlist first col1 from tbl where i < n
\
q)f[tbl2;3]
date | c1 c2 c3
----------| --------------
|
|
|
2021.01.04| 4.1 4.1 4.1
2021.01.05| 5.1 5.1 5.1
2021.01.06| 6.1 6.1 6.1
有关功能更新的更多信息,请参阅:
你好,乔治。非常感谢!我在我原来的帖子里稍微修改了一下表格,不知道你能不能帮我一下。非常感谢!啊,问题是第二个表没有相同类型的列。我完全同意Matt Moore在他的回答中的观点,即使用prev比尝试巧妙地解释不同的类型要好,如果您有复合列(例如字符串),这将特别困难。