PostgreSQL:按FIFO/LIFO获取满足数量要求的出库单项目ID?
按FIFO/LIFO筛选满足数量要求的出库单项目ID
针对你的需求,使用窗口函数计算累计数量是最简洁高效的方案,比WHILE循环或递归CTE更易维护且性能更优。以下是具体实现:
FIFO(先进先出)实现
按received字段升序排序,计算每行的累计出库数量,筛选出累计量覆盖目标数量(示例中为10)的项目ID:
WITH running_total AS ( SELECT id, quantity, SUM(quantity) OVER (ORDER BY received ASC) AS cumulative_qty FROM delivery_note_item WHERE stock_item_id = 1 ) SELECT id FROM running_total WHERE cumulative_qty - quantity < 10;
执行结果返回ID 1、2、3,累计总量5+3+9=17,满足目标10的要求。
LIFO(后进先出)实现
按received字段降序排序,同样计算累计数量:
WITH running_total AS ( SELECT id, quantity, SUM(quantity) OVER (ORDER BY received DESC) AS cumulative_qty FROM delivery_note_item WHERE stock_item_id = 1 ) SELECT id FROM running_total WHERE cumulative_qty - quantity < 10;
执行结果返回ID 4、3,累计总量8+9=17,满足目标10的要求。
方案对比
- WHILE循环:需要逐行迭代处理,数据量大时性能低下,代码冗余。
- 递归CTE:可以实现需求,但写法复杂,可读性差。
- 窗口函数:一行计算累计量,逻辑清晰,执行效率高,是最优选择。
内容的提问来源于stack exchange,提问作者Gabor
相关产品推荐
相关产品推荐

