【问题标题】:How to display next planned check?如何显示下一个计划检查?
【发布时间】:2021-12-29 10:20:34
【问题描述】:

我有一个名为 TASK_CHECK 的表,它看起来像这样:

type COMPLETION_DATE
KDA 17.12.2021
KDB 18.12.2021

还有一个名为 TASK_SCHEDULE 的表,如下所示:

check_id type SCHEDULED_DATE
201 KDA 19.12.2021
202 KDA 22.12.2021
203 KDA 23.12.2021
204 KDB 21.12.2021
205 KDB 23.12.2021

现在我需要显示第一个表,但还有一列,我需要显示第二个表中的第一个下一个 check_id,这发生在完成日期之后。例如:

type COMPLETION_DATE SCHEDULED_DATE check_id
KDA 17.12.2021 19.12.2021 201
KDB 18.12.2021 23.12.2021 204

【问题讨论】:

  • 请更正您的示例并添加预期的列
  • 您的结果与您的源表相同。
  • 看起来像这样是因为另一个人的问题编辑不当;我把它回滚了,现在它看起来应该有,@Stu。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

这是一个选项(第 1 - 12 行中的示例数据;您不需要那个 - 您可能感兴趣的查询从第 14 行开始):

SQL> with
  2  task_check (type, completion_date) as
  3    (select 'KDA', date '2021-12-17' from dual union all
  4     select 'KDB', date '2021-12-18' from dual
  5    ),
  6  task_schedule (check_id, type, scheduled_date) as
  7    (select 201, 'KDA', date '2021-12-19' from dual union all
  8     select 202, 'KDA', date '2021-12-22' from dual union all
  9     select 203, 'KDA', date '2021-12-23' from dual union all
 10     select 204, 'KDB', date '2021-12-21' from dual union all
 11     select 205, 'KDB', date '2021-12-23' from dual
 12    )
 13  --
 14  select c.type, c.completion_date, s.scheduled_date, s.check_id
 15  from task_check c join task_schedule s on s.type = c.type
 16  where s.scheduled_date = (select min(s1.scheduled_date)
 17                            from task_schedule s1
 18                            where s1.type = s.type
 19                              and s1.scheduled_date > c.completion_date
 20                           );

TYP COMPLETION SCHEDULED_   CHECK_ID
--- ---------- ---------- ----------
KDA 17.12.2021 19.12.2021        201
KDB 18.12.2021 21.12.2021        204

SQL>

【讨论】:

    【解决方案2】:

    你可以CROSS JOIN一个横向派生表

    select c.type, c.completion_date, s.scheduled_date, s.check_id
    from task_check c
      cross join lateral (select * from task_schedule
                          where type = c.type
                            and scheduled_date > c.completion_date
                          order by scheduled_date
                          fetch first 1 row only) s
    

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多