Q语言中wj函数计算sumproduct失败,如何实现该运算?
Q语言中在wj函数内实现Sumproduct运算的解决方案
你的问题出在wj函数的聚合参数语法上:sum需要接收单个列引用,直接嵌套(*;price;weight)不符合wj的参数规则。以下是两种可行的解决方法:
方法一:预计算乘积列
先在源表q中新增price*weight的乘积列,再对该列执行sum聚合:
t:([]sym:3#`ibm;time:10:01:01 10:01:04 10:01:08;price:100 101 105); price:101 103 103 104 104 107 108 107 108; weight:98 99 102 103 103 104 106 106 107; q:([]sym:`ibm; time:10:01:01+til 9; price:price; weight:weight); // 新增乘积列 q:update prod:price*weight from q; f:`sym`time; w:-2 1+\:t.time; // 对预计算的prod列求和 wj[w;f;t;(q;(sum;`price);(sum;`weight);(sum;`prod))];
方法二:使用匿名函数直接计算
通过匿名函数在聚合阶段实时计算price*weight的总和,无需修改源表:
t:([]sym:3#`ibm;time:10:01:01 10:01:04 10:01:08;price:100 101 105); price:101 103 103 104 104 107 108 107 108; weight:98 99 102 103 103 104 106 106 107; q:([]sym:`ibm; time:10:01:01+til 9; price:price; weight:weight); f:`sym`time; w:-2 1+\:t.time; // 用匿名函数实现sumproduct,最后指定结果列名为sumprod wj[w;f;t;(q;(sum;`price);(sum;`weight);{sum x.price*x.weight};`sumprod)];
两种方法都能得到正确的sumproduct结果:
- 方法一适合需要重复使用乘积列的场景
- 方法二更简洁,无需修改源表结构
内容的提问来源于stack exchange,提问作者H42
相关产品推荐
相关产品推荐

