You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Q/KDB中如何逐行仅基于当前行与前一行应用公式?

我来帮你搞定kdb+里这个逐行计算的问题!你的需求是按sym分组后,每行都计算当前行和前一行的price之和对吧?咱们一步步来解决:

核心思路

你要的其实是分组后的滑动窗口求和(窗口大小为2),kdb+里有两种常用方式实现,一种是用内置的高效函数,另一种是手动用Scan操作符\来实现逐行迭代逻辑。

方法1:用msum(最简洁高效)

kdb+的msum(移动求和)函数专门处理这类固定窗口的滚动计算,指定窗口大小为2就能直接得到每行的结果:

select rollingSum: 2 msum price by sym from data
  • 小细节:每个sym的第一行因为没有前一行,结果会是null。如果想让第一行直接返回自身的price,可以改成0N 2 msum price,这样第一行取当前值,从第二行开始计算两行之和。

方法2:用Scan操作符\手动实现

如果你想基于Scan的逐行迭代特性来写,可以结合fby分组,对每个sym的price序列,用Scan来跟踪前一行的值,再和当前行相加:

select rollingSum: {prev, prev+x}\[(); price] by sym from data

如果希望第一行不返回null,而是自身的price,可以调整初始值和逻辑:

select rollingSum: {if[count x=0; :y]; x+y}\[0; price] by sym from data

不过要注意,这种手动实现的效率不如内置的msum,如果数据集很大,优先用第一种方法。

为什么你原来的语句只返回单个数据点?

你之前写的select sum price from data where i=(last;i)fby sym,其实是只取每个sym组的最后两行求和,所以每个组只返回一个结果,而不是每行都输出。要实现逐行计算,需要对每个组的每一行应用窗口逻辑,而不是只筛选最后两行。

内容的提问来源于stack exchange,提问作者Fomalhaut -C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:25:37