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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:17:12