Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Почему заедается интервал?  [new]
Hawker_1
Member

Откуда: Москва
Сообщений: 81
with 
wrn1 as (
    select 1 as id, 5 as status, to_date ('02.09.2015 06.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all  
    select 1 as id, 6 as status, to_date ('05.09.2015 02.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 1 as id, 5 as status, to_date ('07.09.2015 05.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 1 as id, 6 as status, to_date ('07.09.2015 11.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual  -- why lost? 
    union all
    select 2 as id, 5 as status, to_date ('03.09.2015 11.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 2 as id, 6 as status, to_date ('04.09.2015 11.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all 
    select 2 as id, 5 as status, to_date ('08.09.2015 1.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 2 as id, 6 as status, to_date ('09.09.2015 2.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual       -- why lost? 
),   
wrn as  (
    select id, status, dt, lead (dt) over (partition by id order by dt) dt_next from wrn1 
),                 
i2 as (                
    select dt1 from (
        select to_date ('01.09.2015', 'DD.MM.YYYY') + level - 1 dt1 from dual  -- trunc(sysdate,'yyyy') + level - 1
            connect by level <= 366
    ) where dt1 <= sysdate     
),
i2_join as (
    select id, dt1 from i2
    cross join (
                 select distinct id from wrn1)                           
)
select i2_join.id, i2_join.dt1, 
         last_value( wrn.status ignore nulls) over (partition by i2_join.id order by i2_join.dt1, wrn.dt ) status,
         wrn.dt, wrn.dt_next 
    from i2_join 
    left join  wrn on
            i2_join.id = wrn.id
            and i2_join.dt1 >= trunc(wrn.dt)  
            and i2_join.dt1 < wrn.dt_next          
order by id, dt1, dt;    
    



последняя запись не оказывает влияния

1	01.09.2015			
1	02.09.2015	5	02.09.2015 6:00:00	05.09.2015 2:00:00
1	03.09.2015	5	02.09.2015 6:00:00	05.09.2015 2:00:00
1	04.09.2015	5	02.09.2015 6:00:00	05.09.2015 2:00:00
1	05.09.2015	5	02.09.2015 6:00:00	05.09.2015 2:00:00
1	05.09.2015	6	05.09.2015 2:00:00	07.09.2015 5:00:00
1	06.09.2015	6	05.09.2015 2:00:00	07.09.2015 5:00:00
1	07.09.2015	6	05.09.2015 2:00:00	07.09.2015 5:00:00
1	07.09.2015	5	07.09.2015 5:00:00	07.09.2015 11:00:00
1	08.09.2015	5		
1	09.09.2015	5		
1	10.09.2015	5		
2	01.09.2015			
2	02.09.2015			
2	03.09.2015	5	03.09.2015 11:00:00	04.09.2015 11:00:00
2	04.09.2015	5	03.09.2015 11:00:00	04.09.2015 11:00:00
2	04.09.2015	6	04.09.2015 11:00:00	08.09.2015 1:00:00
2	05.09.2015	6	04.09.2015 11:00:00	08.09.2015 1:00:00
2	06.09.2015	6	04.09.2015 11:00:00	08.09.2015 1:00:00
2	07.09.2015	6	04.09.2015 11:00:00	08.09.2015 1:00:00
2	08.09.2015	6	04.09.2015 11:00:00	08.09.2015 1:00:00
2	08.09.2015	5	08.09.2015 1:00:00	09.09.2015 2:00:00
2	09.09.2015	5	08.09.2015 1:00:00	09.09.2015 2:00:00
2	10.09.2015	5		


в конце должно быть статус 6 для 1 и для 2.
10 сен 15, 14:11    [18132829]     Ответить | Цитировать Сообщить модератору
 Re: Почему заедается интервал?  [new]
Hawker_1
Member

Откуда: Москва
Сообщений: 81
Solved:
+
with 
wrn1 as (
    select 1 as id, 5 as status, to_date ('02.09.2015 06.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all  
    select 1 as id, 6 as status, to_date ('05.09.2015 02.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 1 as id, 5 as status, to_date ('07.09.2015 05.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 1 as id, 6 as status, to_date ('07.09.2015 11.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual  -- why lost? 
    union all
    select 2 as id, 5 as status, to_date ('03.09.2015 11.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 2 as id, 6 as status, to_date ('04.09.2015 11.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all 
    select 2 as id, 5 as status, to_date ('08.09.2015 1.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
    union all
    select 2 as id, 6 as status, to_date ('09.09.2015 2.00.00', 'DD.MM.YYYY HH24:MI:SS') as dt from dual       -- why lost? 
),   
wrn as  (
    select id, status, dt, lead (dt, 1, trunc(sysdate) + 1) over (partition by id order by dt) dt_next from wrn1 
),                 
i2 as (                
    select dt1 from (
        select to_date ('01.09.2015', 'DD.MM.YYYY') + level - 1 dt1 from dual  -- trunc(sysdate,'yyyy') + level - 1
            connect by level <= 366
    ) where dt1 <= sysdate     
),
i2_join as (
    select id, dt1 from i2
    cross join (
                 select distinct id from wrn1)                           
)
select i2_join.id, i2_join.dt1, 
         last_value( wrn.status ignore nulls) over (partition by i2_join.id order by i2_join.dt1, wrn.dt ) status,
         wrn.dt, wrn.dt_next 
    from i2_join 
    left join  wrn on
            i2_join.id = wrn.id
            and i2_join.dt1 >= trunc(wrn.dt)  
            and i2_join.dt1 < wrn.dt_next          
order by id, dt1, dt;    
10 сен 15, 14:23    [18132910]     Ответить | Цитировать Сообщить модератору
 Re: Почему заедается интервал?  [new]
Elic
Member

Откуда:
Сообщений: 29980
Потому что поток сознания.
+
Чему равно следующее за последним?
10 сен 15, 14:24    [18132914]     Ответить | Цитировать Сообщить модератору
 Re: Почему заедается интервал?  [new]
Hawker_1
Member

Откуда: Москва
Сообщений: 81
та уже увидел спс
10 сен 15, 14:26    [18132943]     Ответить | Цитировать Сообщить модератору
 Re: Почему заедается интервал?  [new]
Elic
Member

Откуда:
Сообщений: 29980
Hawker_1
та уже увидел
В следующий раз сперва подумай, прежде чем вываливать поток сознания.
10 сен 15, 14:39    [18133031]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить