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
似乎 item
未用于连接行(在您的示例中,位置中没有 Item2)。如果需要,请在解析函数中使用 partition by
并在连接条件中使用 item
。
我拼命尝试让它工作,但我被卡住了。任何帮助表示赞赏!我有两个 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
似乎 item
未用于连接行(在您的示例中,位置中没有 Item2)。如果需要,请在解析函数中使用 partition by
并在连接条件中使用 item
。