Oracle使用MODEL子句按奇偶行规则计算C值结果出错如何修复?
修复Oracle逐行递推计算的MODEL查询
原查询的MODEL子句默认未指定计算顺序,所有行的c值计算会并行执行,计算rn≥3的行时,上一行的c还停留在初始的0值,导致结果全部为0。
修复后的查询语句如下:
select * FROM ( Select 1 rn, 1 V from dual UNION ALL Select 2 rn, 2 V from dual UNION ALL Select 3 rn, 4 V from dual UNION ALL Select 4 rn, 2 V from dual UNION ALL Select 5 rn, 3 V from dual ) MODEL DIMENSION BY (rn) MEASURES ( V, cast(0 as number) c) -- 显式指定为number类型避免整数运算截断 RULES UPDATE SEQUENCE ORDER BY rn -- 强制按rn升序逐行计算,确保上一行的c已完成计算 ( c[MOD(rn, 2) != 0] = nvl(c[cv()-1],1) * V[cv()] ,c[MOD(rn, 2) = 0] = c[cv()-1] / V[cv()] ) order by rn;
运行后输出结果和预期完全一致:
| RN | V | C |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 0.5 |
| 3 | 4 | 2 |
| 4 | 2 | 1 |
| 5 | 3 | 3 |
内容的提问来源于stack exchange,提问作者Jenja O
相关产品推荐
相关产品推荐

