基于初始值计算累计差值:生产库存数据优化需求
解决方案
直接通过调整窗口函数的范围来修正计算逻辑,实现符合需求的剩余库存计算:
SELECT qty_needed, CASE -- 分组内第一行保留初始库存值 WHEN ROW_NUMBER() OVER (PARTITION BY component ORDER BY partno) = 1 THEN qty_onhand -- 计算剩余库存:初始库存减去之前所有行的需求累计值,库存耗尽后显示0 ELSE GREATEST( qty_onhand - SUM(qty_needed) OVER ( PARTITION BY component ORDER BY partno ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) END AS remaining_qty_onhand FROM your_table_name;
逻辑说明
- 第一行处理:用
ROW_NUMBER()标记分组内的首行,直接返回原始qty_onhand作为初始库存。 - 后续行计算:
- 窗口函数
SUM(qty_needed)限定范围为当前行之前的所有行,避免包含当前行的需求值,确保累计的是已消耗的总量。 - 用
GREATEST(..., 0)确保剩余库存不会出现负数,库存耗尽后固定显示0。
- 窗口函数
- 分组与排序:
PARTITION BY component保证按物料独立计算,ORDER BY partno确保需求处理顺序符合业务逻辑。
示例验证
针对你的测试数据,执行后会输出:
| qty_needed | remaining_qty_onhand |
|---|---|
| 5 | 10 |
| 5 | 5 |
| 5 | 0 |
原脚本问题分析
原脚本中SUM(qty_needed)的窗口范围是ROWS UNBOUNDED PRECEDING,会包含当前行的需求值,导致第一行计算时就出现10-5=5的错误结果,不符合初始库存显示要求。调整窗口范围为“到前一行”即可解决该问题。
内容的提问来源于stack exchange,提问作者Safrollah Acob
相关产品推荐
相关产品推荐

