SQL - 限制连接显示结果的时间

SQL - Limit Time a Join Shows a Result

我拼命尝试让它工作,但我被卡住了。任何帮助表示赞赏!我有两个 table。 Table 1 是客户, table 2 是库存的位置和数量。问题是我需要一个垃圾箱被推荐的次数受到数量的限制,所以一旦它推荐了整个数量,它就会停止推荐那个垃圾箱……这让我很困惑。

Table 1
Customer | Item | Qty
1 | Item1 | 2
1 | Item2 | 1
2 | Item1 | 1
3 | Item1 | 1
4 | Item1 | 1
5 | Item1 | 1
6 | Item1 | 1

Table 2
Item | Bin | Qty
Item1 | A1 | 1
Item1 | A84 | 2
Item1 | C32 | 2
Item1 | D01 | 1

一旦匹配次数达到数量计数,输出将停止推荐第一场比赛...我完全卡住了...

输出看起来像
客户 |项目 |斌
1 |项目 1 | A1
1 |项目 2 | A84
2 |项目 1 | A84
3 |项目 1 | C32
4 |项目 1 | C32
5 |项目 1 | D01
6 |项目 1 | (因为没有其他垃圾箱了)


到目前为止,在 Ponder 的帮助下,脚本是...

SELECT
    CUST.CUSTOMER, CUST.ITEM, BIN
FROM (
        SELECT 
            ROW_NUMBER() OVER (PARTITION BY CUSTOMER, ITEM ORDER BY CUSTOMER ASC, ITEM ASC) AS RN, 
            CUSTOMER, 
            ITEM 
        FROM CUSTOMERS 
    ) CUST
LEFT JOIN (
            SELECT 
                ITEM,
                BIN, 
                LAG(Q2, 1, 0) OVER (PARTITION BY ITEM, BIN ORDER BY ITEM ASC, BIN ASC) Q1, 
                Q2
            FROM (
                    SELECT
                        ITEM,
                        BIN,
                        SUM(QTY) OVER (PARTITION BY ITEM, BIN ORDER BY ITEM ASC, BIN ASC) Q2
                    FROM INVENTORY I
                    )
                ) INV ON Q1 < RN AND Q2 <= RN AND CUST.ITEM = INV.ITEM

table 个客户中的行数。对 table 个位置的数量进行累计。使用左连接和定义的范围将客户的行分配到位置。您没有指定您使用的是什么 RDBM,所以这是 Oracle 解决方案,但它使用的标准函数应该适用于大多数数据库,或者至少您可以轻松应用此逻辑:

select customer, item, bin
  from (select row_number() over (order by customer) as rn, customer, item 
          from customers)
  left join (
        select bin, lag(q2, 1, 0) over (order by bin) q1, q2 
          from (select bin, sum(qty) over (order by bin) q2 from locations))
    on q1 < rn and rn <= q2

dbfiddle

似乎 item 未用于连接行(在您的示例中,位置中没有 Item2)。如果需要,请在解析函数中使用 partition by 并在连接条件中使用 item