我拼命寻求所有的甲骨文SQL大师和超级英雄在这里的帮助位。任何建议和/或帮助将不胜感激。
我有一张table
表1和DML
create table tab_A
(item varchar2(20),
dest varchar2(20),
qty number,
eff date,
disc date,
eventbegin date,
eventend date,
eventqty number
);
insert into tab_a values('item1','dest1',18,'27 July 2023','4 Sep 2023','4 Aug 2023','25 Sep 2023',6);
insert into tab_a values('item1','dest1',30,'4 Sep 2023','2 Oct 2023','4 Aug 2023','25 Sep 2023',6);
insert into tab_a values('item1','dest1',18,'2 Oct 2023','1 Sep 2025','4 Aug 2023','25 Sep 2023',6);
表A**
| 项目|DEST|数量|EFF|盘|晚上开始|活动|事件|
| --|--|--|--|--|--|--|--|
| item1| dest1| 18 |2023年7月27日|2023年9月4日|2023年8月4日|2023年9月25日| 6 |
| item1| dest1| 30 |2023年9月4日|2023年10月2日|2023年8月4日|2023年9月25日| 6 |
| item1| dest1| 18 |2023年10月2日|2025年9月1日|2023年8月4日|2023年9月25日| 6 |
期望输出
新创建的EFF和DISC日期应始终连续。
我需要根据以下内容调整EFF和DISC日期
- 如果eff和disc日期小于EVENTBEGIN,则保持原样
- 如果EVENTBEGIN在EFF和DISC之间,则将DISC日期设置为EVENTBEGIN并开始新的ROW
- 新行EVENTBEGIN成为新的EFF,如果前一行的DISC小于EVENTEND,则使用前一行DISC。其中EVENTBEGIN为EFF的Orig_qty需要将EVENTQTY添加到ORIG_QTY。
- 如果下一行的EFF小于EventEnd,则EFF和DISC日期是CURRENT ROW DISC和EVENTEND的出租人。EventEnd窗口为DISC的Orig_qty需要将EVENTQTY添加到ORIG_QTY。
- 事件结束日期是新的EFF,直到DISC日期结束,数量保持不变。
- 如果EFF大于EventEnd,则保留记录
新创建的EFF和DISC日期应始终连续。
| 项目|DEST|原材料数量|生效日期|光盘日期|
| --|--|--|--|--|
| item1| loc1| 18 |2023年7月27日|2023年8月28日|
| item1| loc1| 24 |2023年8月28日|2023年9月4日|
| item1| loc1| 36 |2023年9月4日|2023年9月25日|
| item1| loc1| 30 |2023年9月25日|2023年10月2日|
| item1| loc1| 18 |2023年10月2日|一九九九年一月一日|
1条答案
按热度按时间pgky5nke1#
我看不出你会为此使用多个查询,尽管这不应该是一个问题。这可能需要一个多小时才能解决,但我希望我能帮助你。
你可能需要使用
CASE WHEN
-expressions来处理所有的ifs和buts。https://www.oracletutorial.com/oracle-basics/oracle-case/您也可以通过使用多个查询连接到一个结果来帮助解决这个问题,因为您有三行,而需要六行。https://www.oracletutorial.com/oracle-basics/oracle-union/
在处理部分日期问题时,似乎使用
LAG()
函数可能适合您,因为它会查看前一行。https://www.oracletutorial.com/oracle-analytic-functions/oracle-lag/您可能还希望使用公共表表达式(CTE),它可以帮助简化查询。这是可选的,可能会使它更难可视化,但它不太可能更高的性能。https://www.databasestar.com/sql-cte-with/