SQL记录按日期动态修改和扩展

问题描述 投票:0回答:1

我迫切地向所有 Oracle SQL 专家和超级英雄寻求帮助。任何建议和/或帮助将不胜感激。

我有一张桌子

表DDL和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

项目 目的地 数量 EFF 光盘 开始 活动结束 活动数量
项目1 目的地1 18 2023 年 7 月 27 日 2023 年 9 月 4 日 2023 年 8 月 4 日 2023 年 9 月 25 日 6
项目1 目的地1 30 2023 年 9 月 4 日 2023年10月2日 2023 年 8 月 4 日 2023 年 9 月 25 日 6
项目1 目的地1 18 2023年10月2日 2025 年 9 月 1 日 2023 年 8 月 4 日 2023 年 9 月 25 日 6

所需输出

新创建的 EFF 和 DISC 日期应始终是连续的。

我需要根据以下内容调整 Eff 和 DISC 日期

  • 如果 eff 和光盘日期小于 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。
  • EventEnd 日期是新的 EFF,直到 DISC 日期结束,数量保持不变。
  • 如果 EFF 大于 EventEnd,则保留记录不变

新创建的 EFF 和 DISC 日期应始终是连续的。

项目 目的地 ORIG_QTY EFF_DATE DISC_DATE
项目1 loc1 18 2023 年 7 月 27 日 2023年8月28日
项目1 loc1 24 2023年8月28日 2023 年 9 月 4 日
项目1 loc1 36 2023 年 9 月 4 日 2023 年 9 月 25 日
项目1 loc1 30 2023 年 9 月 25 日 2023 年 10 月 2 日
项目1 loc1 18 2023 年 10 月 2 日 2999/1/1
sql oracle oracle11g
1个回答
0
投票

我看不到您为此使用多个查询,尽管这不应该是问题。这可能需要一个多小时才能解决,但我希望我能帮助你。

您可能想要使用

CASE WHEN
表达式来处理所有的 if 和 buts。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm

您还可以通过使用多个查询连接到一个结果来帮助解决此问题,因为您有三行并且需要六行。 https://www.oracletutorial.com/oracle-basics/oracle-union/

在处理部分日期问题时,似乎使用

LAG()
函数可能适合您,因为它会查看上一行。 https://www.oracletutorial.com/oracle-analytic-functions/oracle-lag/

LAG()
函数可以与
DateAdd()
函数结合使用,以帮助获得正确的日期。 https://docs.oracle.com/cd/E41183_01/DR/Dateadd.html

您可能还想使用通用表表达式(CTE),它可以帮助简化查询。这是更可选的,并且可能会使其更难以可视化,但它的性能也并非不可能。 https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/with.html#common-table-expressions

© www.soinside.com 2019 - 2024. All rights reserved.