我有一桌集装箱

containerID 能力
1 2
2 5
3 10

和一张物品表

ItemID 容器ID
1
2
3
4
5
6
7
8
9
10
11
12

我想要这个.第一个容器可以容纳2个记录,所以前2个记录放在容器1中,接下来的5个记录放在容器2中,下一个容器容纳10个记录,但还有5个记录,所以剩下的记录放在最后一个容器中.

ItemID 容器ID
1 1
2 1
3 2
4 2
5 2
6 2
7 2
8 3
9 3
10 3
11 3
12 3

我已经简化了这个问题,但您可以假设可用的容器将容纳所有可用的项目.

我通常可以在这里找到一个解决方案,但我不知道如何用我的搜索来寻找一些东西.

我想我可以为项目表分配一个序列,如下所示

select 
(Row_number()
           OVER(
             ORDER BY itemid) - 1 ) / 2 + 1 AS seq

然后用它来匹配我的容器,但这不是动态的,因为容器的容量不是静态的.

推荐答案

有一个CTE返回集装箱容量的运行总和.JOIN元,含项目表.做一个GROUP BY,然后用MIN()找出"第一个"能装下这件物品的容器.

with runningcap as (select containerID, sum(capacity) over (order by containerID) cap
                    from containers)
select i.itemid, min(rc.containerID)
from items i
join runningcap rc
  on rc.cap >= i.itemid
group by i.itemid
order by i.itemid

https://dbfiddle.uk/vDZwPPdI岁时演示

Sql相关问答推荐

Oracle SQL对列进行汇总并在列表底部显示总计

SQL是否可以计算每年的所有日期变化?

如何使用WSO2将空值传递给我的SQL Server存储过程?

从日期开始向前填充重复项

计算周时出现SQL错误结果

为什么TRY_CONVERT返回一个XML验证错误而不是NULL?

SQL:如何取上一年的平均值?

如何使用不重复的单个顶级字段(列)向json数组 Select 多行

如果另一个表中不存在值列,则插入失败

在WHERE EXISTS子查询中,列返回是否重要?

查找滑动窗口框架中的最大和最小列值

将时间范围划分为全天和前后剩余小时

SQL中相同表内的VLOOKUP等价

向表中添加新列取决于表的日期列(unpivot)

删除行而不使数据库超载

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

验证某个日期前后的连续代码

强制 SQL 始终通过 R 从视图中返回至少一行

条件前置值

当我按 PK 分组时,该表中的所有列在每个组中都具有相同的值.那么为什么 SQL Server 需要对这些列进行聚合呢?