Spotfire中计算累计油量:创建Final_Cum_Oil计算列的方法
Spotfire计算列:Final_Cum_Oil的正确表达式
问题原因
你原表达式的核心错误在于:当Cum_Oil_Actual非空时直接对其求和,这会把该油井历史所有实际累计值累加(比如Well a的1/3行,会计算5+10+20=35,而非直接取20),导致结果偏离预期。
正确逻辑应为:
- 当
Cum_Oil_Actual有值时,直接使用该值; - 当
Cum_Oil_Actual为空时,基于该油井最后一个有效的实际累计值,加上后续日期的预测产量累计增量。
解决方案
直接创建名为Final_Cum_Oil的计算列,使用以下表达式:
If([Cum_Oil_Actual] IS NOT NULL, [Cum_Oil_Actual], Last(If([Cum_Oil_Actual] IS NOT NULL, [Cum_Oil_Actual])) OVER (Partition By [Well]) + (Sum([Oil_Rate_Forecast]) OVER (Partition By [Well] Order By [Date] Rows Between Unbounded Preceding And Current Row) - Last(If([Cum_Oil_Actual] IS NOT NULL, Sum([Oil_Rate_Forecast]) OVER (Partition By [Well] Order By [Date] Rows Between Unbounded Preceding And Current Row))) OVER (Partition By [Well])) )
表达式拆解
- 非空值直接返回:如果
Cum_Oil_Actual不为空,直接使用该实际累计值; - 获取最后有效实际累计:通过
Last(...) OVER (Partition By [Well])提取当前油井最后一个有实际累计的数值; - 计算预测增量:
- 先计算从油井第一行到当前行的预测产量累计和;
- 减去最后一个有效实际累计对应的预测累计和,得到从该点到当前行的预测产量增量;
- 合并延续累计:用最后有效实际累计加上预测增量,得到延续后的累计值。
结果验证
代入你的测试数据后,该表达式将生成完全符合预期的Final_Cum_Oil列:
- Well a的1/4行:
20 + (10+10+10+20 - (10+10+10)) = 40; - Well b的1/5行:
20 + (10+10+10+15+15 - (10+10+10)) = 50。
内容的提问来源于stack exchange,提问作者Cartman23
相关产品推荐
相关产品推荐

