Союзные времена в sql oracle - сложная проблема - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть большая таблица с временем начала и окончания. Это выглядит так: Start_time дата-время (формат: дд / мм / гггг чч24: ми: сс),
Конечное время дата-время (формат: дд / мм / гггг чч24: ми: сс) У меня могут быть строки, представляющие время, включенное в другие строки

Мой желаемый результат - таблица, которая может решить эту проблему. Я хочу взять немного времени и посмотреть рядом с ним в последний раз.

Я попытался объединить таблицу с самим собой во время начала между временем начала и временем окончания, если конец секунды больше конца первого. Затем сделать скользящее окно и взять максимальное время окончания с помощью скользящего окна или даже с группированием по.

Однако, эта идея учитывает то, что я могу иметь, например:

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 голосов
/ 09 апреля 2019

Я не знаю, как отформатировать, но вы можете скопировать вставить в вашем редакторе, а затем отформатировать. Используя мои данные испытаний с оператором «with», вы можете использовать свою таблицу.

Полагаю, у вас есть какой-то идентификатор, поэтому я включаю его:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...