SQL Oracle中的联合时间-困难的问题

时间:2019-04-08 20:20:13

标签: sql oracle

我在一张大桌子上有开始时间和结束时间。 看起来像这样: 开始时间日期时间(格式:dd / mm / yyyy hh24:mi:ss),
结束时间日期时间(格式:dd / mm / yyyy hh24:mi:ss) 我可能有代表时间的行包含在其他行中

我想要的结果是一个可以解决此问题的表格。我想花点时间,最后一次结束时间在他旁边。

如果第二个的结尾大于第一个的结尾,我尝试在开始时间和结束时间之间的开始时间离开表本身。然后做一个滑动窗口,并用滑动窗口或什至分组依据来获取最大结束时间。

但是,这个想法确实考虑在内,例如,我可能会想到:

10:05-10:10
10:07-10:12
10:09-10:15
10:11-10:20

据称,当我加入时,我得到了10:05-10:15和10:11-10:20。 10:11的行未连接到第一行,因为此时未包括该行。 我又遇到了与开始时一样的问题。

我想要的结果实际上是上面的行: 10:05-10:20 似乎是一个难题。

我不了解plsql,但可能想做一些重复查询的功能,直到没有任何要加入的内容?

希望得到ypur的帮助! 谢谢。

1 个答案:

答案 0 :(得分:0)

我不知道如何格式化,但是您可以在编辑器中复制粘贴内容,而不是格式化。 在操作员“ with”插入我的测试数据后,您可以使用表格。

我想您有某种ID,所以我将其包括在内:

with test_table as (
  select 1 id, to_date('2019-04-07 10:05', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-07 10:08', 'yyyy-mm-dd hh24:mi') end_time from dual union all
  select 2 id, to_date('2019-04-07 10:07', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-07 10:10', 'yyyy-mm-dd hh24:mi') end_time from dual union all
  select 3 id, to_date('2019-04-07 10:11', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-07 10:15', 'yyyy-mm-dd hh24:mi') end_time from dual union all
  select 4 id, to_date('2019-04-07 10:12', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-07 10:20', 'yyyy-mm-dd hh24:mi') end_time from dual union all

  select 5 id, to_date('2019-04-08 10:05', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-08 10:10', 'yyyy-mm-dd hh24:mi') end_time from dual union all
  select 6 id, to_date('2019-04-08 10:07', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-08 10:12', 'yyyy-mm-dd hh24:mi') end_time from dual union all
  select 7 id, to_date('2019-04-08 10:09', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-08 10:15', 'yyyy-mm-dd hh24:mi') end_time from dual union all
  select 8 id, to_date('2019-04-08 10:11', 'yyyy-mm-dd hh24:mi') start_time, to_date('2019-04-08 10:20', 'yyyy-mm-dd hh24:mi') end_time from dual
)
select id, to_char(start_time, 'yyyy-mm-dd hh24:mi') start_time,  to_char(end_time, 'yyyy-mm-dd hh24:mi') end_time,
       (SELECT MAX(to_char(end_time, 'yyyy-mm-dd hh24:mi'))
        from test_table t2
        connect by nocycle
          prior t2.id != t2.id            and
          PRIOR end_time > start_time     and 
          PRIOR start_time < end_time
          start with t2.id = t1.id) max_date
from test_table t1;