任何有关以下的帮助将不胜感激!
我有两个表:table1是一个汇总表,同时table2是所有数据点的列表.我希望能够总结table2每行中的信息table1.
table1:flip `grp`constraint!(`a`b`c`d; 10 10 20 20);
table2:flip `grp`cat`constraint`val!(`a`a`a`a`a`b`b`b;`cl1`cl1`cl1`cl2`cl2`cl2`cl2`cl1; 10 10 10 10 10 10 20 10; 1 2 3 4 5 6 7 8);
function:{[grpL;constraintL;catL] first exec total: sum val from table2 where constraint=constraintL, grp=grpL,cat=catL};
update cl1:function'[grp;constraint;`cl1], cl2:function'[grp;constraint;`cl2] from table1;
Run Code Online (Sandbox Code Playgroud)
这段代码的第四行达到了我想要的两个类别:cl1和cl2
在table1我想命名一个具有类别名称(cl1,cl2等)的新列,我希望该列中的值是在该列上运行该函数的输出.
但是,我有数百个不同的类别,因此不希望像第四行那样手动列出它们.我如何传递类别列表,例如下面?
`cl1`cl2`cl3
Run Code Online (Sandbox Code Playgroud)
坚持你的方法,你只需要让你的更新语句功能,然后迭代列,如下所示:
{![`table1;();0b;(1#x)!enlist ((';function);`grp;`constraint;1#x)]} each `cl1`cl2
Run Code Online (Sandbox Code Playgroud)
假设你可以修改table1.如果您必须保留原始table1,那么您可以按值传递它,但它会消耗更多内存
{![x;();0b;(1#y)!enlist ((';function);`grp;`constraint;1#y)]}/[table1;`cl1`cl2]
Run Code Online (Sandbox Code Playgroud)
另一种方法是聚合,转动和连接,虽然它不一定是更好的解决方案,因为你得到空值而不是零
a:select sum val by cat,grp,constraint from table2
p:exec (exec distinct cat from a)#cat!val by grp,constraint from a
table1 lj p
Run Code Online (Sandbox Code Playgroud)