我在一张大桌子上有开始时间和结束时间。
看起来像这样:
开始时间日期时间(格式: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的帮助! 谢谢。
答案 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;