找出制成产品的原材料

时间:2016-03-17 18:24:15

标签: sql oracle

我现在正试图解决这个问题两天了。我在制造控制方面工作。客户要我计算其产品的原材料消耗量。数据存储在两个表 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     |

1 个答案:

答案 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;