Oracle SQL - 使用第二个 table 确定截止日期

Oracle SQL - Determine due date using a 2nd table

我正在想办法完成这个任务。我需要根据 duty_schedule table 中的时间表确定 task_table 中的 due_date。值勤时间表中的活动天数没有一致的模式,所以我发现这很困难。 我需要 select 在 duty_schedule table 之后的第 5 个活动日 task_date。只有活动列中标记为 1 的天数才可用于确定截止日期。我提供了示例 tables,包括预期结果。 我不知道如何处理这个问题;这是否可以通过查询来完成,或者是否需要创建一个函数,或者更好的选择?

TASK_TABLE: TASK_NUM TASK_DATE DUE_DATE


     1 15-SEP-21 null         
     2 19-SEP-21 null       
     3 20-SEP-21 null      
     4 22-SEP-21 null      
     5 25-SEP-21 null      
     6 26-SEP-21 null     
     7 28-SEP-21 null

duty_schedule: DAY_NUM DUTY_DATE 活跃


     1 15-SEP-21          1
     2 16-SEP-21          0
     3 17-SEP-21          1
     4 18-SEP-21          1
     5 19-SEP-21          0
     6 20-SEP-21          0
     7 21-SEP-21          1
     8 22-SEP-21          1
     9 23-SEP-21          1
    10 24-SEP-21          0
    11 25-SEP-21          1
    12 26-SEP-21          1
    13 27-SEP-21          0
    14 28-SEP-21          1
    15 29-SEP-21          1
    16 30-SEP-21          1
    17 01-OCT-21          1
    18 02-OCT-21          0
    19 03-OCT-21          1
    20 04-OCT-21          0
    21 05-OCT-21          1
    

TASK_TABLE 预期结果: TASK_NUM TASK_DATE DUE_DATE


     1 15-SEP-21 23-SEP-21         
     2 19-SEP-21 26-SEP-21       
     3 20-SEP-21 26-SEP-21      
     4 22-SEP-21 29-SEP-21      
     5 25-SEP-21 01-OCT-21      
     6 26-SEP-21 03-OCT-21     
     7 28-SEP-21 05-OCT-21

使用这些构建示例 tables:

CREATE TABLE TASK_TABLE (
task_num    number(2),
task_date   DATE,
due_date    DATE
);
    
INSERT INTO TASK_TABLE VALUES (1, '15-SEP-21', NULL);
INSERT INTO TASK_TABLE VALUES (2, '19-SEP-21', NULL);
INSERT INTO TASK_TABLE VALUES (3, '20-SEP-21', NULL);
INSERT INTO TASK_TABLE VALUES (4, '22-SEP-21', NULL);
INSERT INTO TASK_TABLE VALUES (5, '25-SEP-21', NULL);
INSERT INTO TASK_TABLE VALUES (6, '26-SEP-21', NULL);
INSERT INTO TASK_TABLE VALUES (7, '28-SEP-21', NULL);
COMMIT;

CREATE TABLE duty_schedule (
day_num NUMBER(3),
duty_date   DATE,
active      NUMBER(1)
);

INSERT INTO duty_schedule VALUES (1,'15-Sep-21',1);
INSERT INTO duty_schedule VALUES (2,'16-Sep-21',0);
INSERT INTO duty_schedule VALUES (3,'17-Sep-21',1);
INSERT INTO duty_schedule VALUES (4,'18-Sep-21',1);
INSERT INTO duty_schedule VALUES (5,'19-Sep-21',0);
INSERT INTO duty_schedule VALUES (6,'20-Sep-21',0);
INSERT INTO duty_schedule VALUES (7,'21-Sep-21',1);
INSERT INTO duty_schedule VALUES (8,'22-Sep-21',1);
INSERT INTO duty_schedule VALUES (9,'23-Sep-21',1);
INSERT INTO duty_schedule VALUES (10,'24-Sep-21',0);
INSERT INTO duty_schedule VALUES (11,'25-Sep-21',1);
INSERT INTO duty_schedule VALUES (12,'26-Sep-21',1);
INSERT INTO duty_schedule VALUES (13,'27-Sep-21',0);
INSERT INTO duty_schedule VALUES (14,'28-Sep-21',1);
INSERT INTO duty_schedule VALUES (15,'29-Sep-21',1);
INSERT INTO duty_schedule VALUES (16,'30-Sep-21',1);
INSERT INTO duty_schedule VALUES (17,'1-Oct-21',1);
INSERT INTO duty_schedule VALUES (18,'2-Oct-21',0);
INSERT INTO duty_schedule VALUES (19,'3-Oct-21',1);
INSERT INTO duty_schedule VALUES (20,'4-Oct-21',0);
INSERT INTO duty_schedule VALUES (21,'5-Oct-21',1);
COMMIT;                     

SELECT 子句或 FROM 子句中使用相关子查询。这里我使用了 FROM 子句:

select
  t.task_num,
  t.task_date,
  d.duty_date
from task_table t
outer apply
(
  select ds.duty_date
  from duty_schedule ds
  where ds.active = 1
  and ds.duty_date > t.task_date
  order by ds.duty_date
  offset 4 rows
  fetch next row only
) d
order by t.task_num;

演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=bdb05d7dfa12874ff03bb39f418524f0