(KDB/Q+)更新简单表的前N行

(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.

我在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.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比尝试巧妙地解释不同的类型要好,如果您有复合列(例如字符串),这将特别困难。