2015-08-07 3 views
0

Можно ли изменить этот запрос ниже, чтобы вместо того, чтобы «ОТКРЫТЬ» было таким же, это было бы ПОСЛЕДНИЙ «ИНТЕРВАЛЕНТНОСТЬ». Если, конечно, это не новый день, то это будет «OPEN»Создать последовательность дат и времени

Например, вот несколько строк даты от текущей версии:

DT   OPEN    CLOSE   NAME INTERVAL END 
8/4/2015 8/4/2015 9:00:00 AM 8/4/2015 2:00:00 PM Bob 8/4/2015 1:00:00 PM 
8/4/2015 8/4/2015 9:00:00 AM 8/4/2015 2:00:00 PM Bob 8/4/2015 2:00:00 PM 
8/5/2015 8/5/2015 9:00:00 AM 8/5/2015 2:00:00 PM Bob 8/5/2015 10:00:00 AM 
8/5/2015 8/5/2015 9:00:00 AM 8/5/2015 2:00:00 PM Bob 8/5/2015 11:00:00 AM 
8/5/2015 8/5/2015 9:00:00 AM 8/5/2015 2:00:00 PM Bob 8/5/2015 12:00:00 PM 

и вот что результат должен быть

DT   OPEN    CLOSE   NAME INTERVAL END 
8/4/2015 8/4/2015 12:00:00 PM 8/4/2015 2:00:00 PM Bob 8/4/2015 1:00:00 PM 
8/4/2015 8/4/2015 1:00:00 PM 8/4/2015 2:00:00 PM Bob 8/4/2015 2:00:00 PM 
8/5/2015 8/5/2015 9:00:00 AM 8/5/2015 2:00:00 PM Bob 8/5/2015 10:00:00 AM 
8/5/2015 8/5/2015 10:00:00 AM 8/5/2015 2:00:00 PM Bob 8/5/2015 11:00:00 AM 
8/5/2015 8/5/2015 11:00:00 AM 8/5/2015 2:00:00 PM Bob 8/5/2015 12:00:00 PM 

здесь в запросе

with par as (
    select date '2015-08-07' enddate, 4 LookBackDays, 3600 inteval, 'Bob' Name, 
     '09:00' open, '14:00' close from dual), 
t1 as (
    select to_char(enddate-level+1, 'yyyy-mm-dd') dt, name, open, close from par 
    connect by level <= LookBackDays + 1), 
t2 as (
    select to_char(to_date(open, 'hh24:mi') + (level) * inteval/(24*60*60), 'hh24:mi') tm 
    from par 
    connect by to_date(open, 'hh24:mi') + level * inteval/(24*60*60) 
       <= to_date(close, 'hh24:mi')) 
select to_date(dt, 'yyyy-mm-dd') dt, 
     to_date(dt||' '||open, 'yyyy-mm-dd hh24:mi') open, 
     to_date(dt||' '||close, 'yyyy-mm-dd hh24:mi') close, name, 
     to_date(dt||' '||tm, 'yyyy-mm-dd hh24:mi') IntervalEnd 
    from t1 cross join t2 order by dt, tm 

спасибо.

ответ

1

Я думаю, что вы хотите использовать функцию задержки и разделять на dt ... Надеюсь, это поможет.

with par as (
    select date '2015-08-07' enddate, 4 LookBackDays, 3600 inteval, 'Bob' Name, 
     '09:00' open, '14:00' close from dual), 
t1 as (
    select to_char(enddate-level+1, 'yyyy-mm-dd') dt, name, open, close from par 
    connect by level <= LookBackDays + 1), 
t2 as (
    select to_char(to_date(open, 'hh24:mi') + (level) * inteval/(24*60*60), 'hh24:mi') tm 
    from par 
    connect by to_date(open, 'hh24:mi') + level * inteval/(24*60*60) 
       <= to_date(close, 'hh24:mi')) 
select to_date(dt, 'yyyy-mm-dd') dt, 
     lag(to_date(dt||' '||tm, 'yyyy-mm-dd hh24:mi'), 1,to_date(dt||' '||open, 'yyyy-mm-dd hh24:mi'))over(partition by to_date(dt||' '||open, 'yyyy-mm-dd hh24:mi') order by tm) open, 
     to_date(dt||' '||close, 'yyyy-mm-dd hh24:mi') close, name, 
     to_date(dt||' '||tm, 'yyyy-mm-dd hh24:mi') IntervalEnd 
from t1 cross join t2 order by dt, tm 
Смежные вопросы