我现在正试图解决这个问题两天了。我在制造控制方面工作。客户要我计算其产品的原材料消耗量。数据存储在两个表 item 和 material 中, 在前表中存储用于制造物品的开始和结束时间,在后一表中存储原料放入机器中时 使用了哪一批。
制造过程是这样的:运营商增加了 原料到机器,在终端输入时间。一段时间后,他启动机器,它融合了数公里的塑料薄膜,每件物品都是一卷通常重达数百公斤的薄膜。机器会自动在项表中插入每个卷的开始和结束时间。
当原材料即将耗尽时,操作员停止机器并从不同批次插入更多原材料,然后再次启动机器。
根据批次的大小,它可以持续多个卷,或者单个卷可以由不同批次的材料制成,
项目表
| begin_time | end_time | item |
|-------------|-----------|------|
| 8:49 | 9:29 | 1 |
| 9:29 | 10:04 | 2 |
| 10:04 | 10:42 | 3 |
材料表
| begin_time | material |
|------------|----------|
| 7:21 | A1 |
| 7:21 | A2 |
| 9:39 | B1 |
| 9:39 | B2 |
| 9:50 | C1 |
| 9:51 | C2 |
|10:14 | D1 |
|10:14 | D2 |
可以看到第一项是用材料A1和A2完成的,但是第二项以A1,A2开始,然后改为B1,B2并完成 与C1和C2 我在尝试将哪个原料批次用于哪个项目时遇到问题。
我在这样的查询中尝试了几种变体
select p.item,i.material
from product p
join (
select distinct a.begin_time as dt1, b.begin_time as dt2
from material a
join material b on a.begin_time < b.begin_time
) i on i.dt1 > p.begin_time and i.dt2 <= p.end_time
where p.item = 2
该查询的结果将是那样的
| item | material |
|--------|-----------|
| 1 | A1 |
| 1 | A2 |
| 2 | A1 |
| 2 | A2 |
| 2 | B1 |
| 2 | B2 |
| 2 | C1 |
| 2 | C2 |
| 3 | C1 |
| 3 | C2 |
| 3 | D1 |
| 3 | D2 |
答案 0 :(得分:0)
如果你知道有两个插槽,那么逻辑是:对于项目表中的每个项目,在指定时间内获取表格中的材料加上两个材料就在前面时间。在Oracle中,您可以使用union all
查询执行此操作:
select i.item, m.material, m.begin_time
from items i join
materials m
on m.begin_time between i.begin_time and i.end_time
union all
select item, material, begin_time
from (select i.item, m.material, m.begin_time,
row_number() over (partition by i.item order by m.begin_time desc) as seqnum
from items i join
materials m
on m.begin_time < i.begin_time
) im
where seqnum <= 2;