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

技术问询:如何从Purchase表选取行至累计quantity不超过Stock表可用库存

需求描述

从采购表(Purchase Table)中选取行,要求累计采购数量(quantity)不超过库存表(Stock Table)中对应itemId和storeId的可用库存(available quantity)。若单条记录导致累计超出,则截取该记录的quantity使累计值等于可用库存;选取时需按date倒序排列。


采购表(Purchase Table)

iditemIdstoreIdquantitydate
810000112023-02-06
710000122023-02-05
610001132023-02-04
510000252023-02-04
410002212023-02-03
310001162023-02-03
210003222023-02-02
110001122023-02-01

库存表(Stock Table)

itemIdstoreId可用库存(available quantity)
1000015
1000022
1000111
1000221
1000321

期望结果表(Result I Want)

itemIdstoreIdquantitydate
10000112023-02-06
10000122023-02-05
10000122023-02-03
10000222023-02-04
10001112023-02-04
10002212023-02-03
10003212023-02-02

解决方案(SQL)

使用窗口函数计算分组内的累计采购量,结合库存数据筛选并调整超出部分的数量:

WITH ranked_purchases AS (
    SELECT 
        p.itemId,
        p.storeId,
        p.quantity,
        p.date,
        SUM(p.quantity) OVER (
            PARTITION BY p.itemId, p.storeId 
            ORDER BY p.date DESC 
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS cumulative_qty,
        s.available_quantity
    FROM Purchase_Table p
    JOIN Stock_Table s 
        ON p.itemId = s.itemId 
        AND p.storeId = s.storeId
),
adjusted_purchases AS (
    SELECT 
        itemId,
        storeId,
        CASE 
            WHEN cumulative_qty <= available_quantity THEN quantity
            ELSE available_quantity - (cumulative_qty - quantity)
        END AS quantity,
        date
    FROM ranked_purchases
    WHERE cumulative_qty - quantity < available_quantity
)
SELECT * 
FROM adjusted_purchases 
ORDER BY itemId, storeId, date DESC;

逻辑说明

  1. ranked_purchases 公共表表达式:关联采购表与库存表,按itemId+storeId分组,以date倒序计算每组内的累计采购量。
  2. adjusted_purchases 公共表表达式:判断每条记录的累计量是否超出可用库存,若超出则截取数量使累计值刚好等于库存;过滤掉累计量已超过库存的后续行。
  3. 最终按itemId、storeId和date倒序输出结果,与期望结果一致。

内容的提问来源于stack exchange,提问作者Shambhu Sharan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:25:56