Интервал времени по последовательным записям

iobox
Дата: 22.09.2015 07:56:53
Добрый день!
Можно ли запросом без дополнительных функций выделить интервалы времени в минутах из следующего набора данных:

with t1 as
(
select 191 as param_id,'21.09.2012 16:31:00' as data_date, 11 as value from dual union all
select 191,'21.09.2012 16:32:00', 12 from dual union all
select 191,'21.09.2012 16:33:00', 10 from dual union all
select 191,'21.09.2012 18:01:00', 12 from dual union all
select 191,'21.09.2012 18:02:00', 10 from dual union all
select 191,'22.09.2012 19:22:00', 14 from dual union all
select 191,'22.09.2012 19:23:00', 17 from dual union all
select 191,'22.09.2012 19:25:00', 18 from dual union all
select 191,'22.09.2012 19:26:00', 19 from dual union all
select 191,'23.09.2012 21:54:00', 19 from dual union all
select 191,'23.09.2012 21:55:00', 19 from dual
)


В итоге мне нужно получить:
PARAM_ID DATA_DATE MINUTES
191 '21.09.2012 16:31:00' 3
191 '21.09.2012 18:01:00' 2
191 '22.09.2012 19:22:00' 4
...
Elic
Дата: 22.09.2015 08:35:08
 15  , t2 as (select param_id as id, to_date(data_date, 'dd.mm.yyyy hh24:mi:ss') as d from t1)
 16  select * from t2
 17    match_recognize
 18    ( partition by id
 19      order by d
 20      measures
 21        first(d) as d
 22      , (last(d) - first(d)) day(0) to second(0) as i
 23     pattern (true seq*)
 24     define
 25        seq as d <= prev(d) + interval '1' minute
 26  );

         ID D                   I
----------- ------------------- ------------------------------
        191 21.09.2012 16:31:00 +0 00:02:00
        191 21.09.2012 18:01:00 +0 00:01:00
        191 22.09.2012 19:22:00 +0 00:01:00
        191 22.09.2012 19:25:00 +0 00:01:00
        191 23.09.2012 21:54:00 +0 00:01:00
iobox
Дата: 22.09.2015 08:40:09
Спасибо!
Но у меня 8-ая версия, match_recognize появился в 12.
Elic
Дата: 22.09.2015 08:43:14
STFF start_of_group
mRdUKE
Дата: 22.09.2015 08:46:32
iobox,

iobox
выделить интервалы времени в минутах

trunc(date,'mi'), но судя по данным Вы хотите групп. по часам .. и что означает поле value?
select  param_id,
        data_date,
        (select count(*) from t1 where trunc(data_date,'hh24')=h group by trunc(data_date,'hh24')) cnt 
from (
select  param_id, 
        data_date, 
        trunc(data_date,'hh24') h,
        row_number() over(partition by trunc(data_date,'hh24') order by data_date) rn
from t1) 
where rn=1
iobox
Дата: 22.09.2015 08:55:31
Value здесь не требуется. Если вкратце, надо найти, когда и сколько по времени в минутах температуры механизмов превышали определенное значение value. По часу группировка не подходит.
stax..
Дата: 22.09.2015 09:37:33
iobox,

  1  with t1 as
  2  (
  3  select 191 as param_id,'21.09.2012 16:31:00' as data_date, 11 as value from dual union all
  4  select 191,'21.09.2012 16:32:00', 12 from dual union all
  5  select 191,'21.09.2012 16:33:00', 10 from dual union all
  6  select 191,'21.09.2012 18:01:00', 12 from dual union all
  7  select 191,'21.09.2012 18:02:00', 10 from dual union all
  8  select 191,'22.09.2012 19:22:00', 14 from dual union all
  9  select 191,'22.09.2012 19:23:00', 17 from dual union all
 10  select 191,'22.09.2012 19:25:00', 18 from dual union all
 11  select 191,'22.09.2012 19:26:00', 19 from dual union all
 12  select 191,'23.09.2012 21:54:00', 19 from dual union all
 13  select 191,'23.09.2012 21:55:00', 19 from dual
 14  )
 15  ,t as
 16  (select param_id,to_date(data_date,'dd.mm.yyyy hh24:mi:ss') dt,value from t1)
 17  ,tt as (
 18  select
 19   t.*
 20   ,sum(decode(greatest(value,10),10,1,0)) over (partition by param_id,trunc(dt) order by dt desc) gr
 21  from t
 22  )
 23  select param_id,min(dt),count(*)
 24  from tt
 25  group by param_id,trunc(dt),gr
 26* order by 1,2
SQL> /

  PARAM_ID MIN(DT)               COUNT(*)
---------- ------------------- ----------
       191 21.09.2012 16:31:00          3
       191 21.09.2012 18:01:00          2
       191 22.09.2012 19:22:00          4
       191 23.09.2012 21:54:00          2

SQL>


.....
stax
iobox
Дата: 22.09.2015 10:00:25
Спасибо! Похоже это то, что нужно. Буду разбираться, как работает.
iobox
Дата: 24.09.2015 13:41:26
В общем, два последних варианта неправильные, первый не могу попробовать из-за версии (у меня 8-ая).
В запросе помощь больше не требуется, соорудил сам, правда на основе join-ов:
....

t90 as
(
select rownum as row_num, t70.* from t70 where ttt > 0  or ttt < = -1  order by p_id, dt_beg 
)
,

t100 as
(
select rownum as row_num, t70.* from t70 where mmm > 0 or mmm < = -1 or mmm is null order by p_id, dt_beg 
)
,

t110 as
(
select t90.p_id as param_id, 
       t90.dt_beg as date_beg, 
       t100.dt_beg as date_end, 
       (case when ((t100.dt_beg - t90.dt_beg) * 24 * 60 + 1) < 0 then 0 else (t100.dt_beg - t90.dt_beg) * 24 * 60 + 1 end )as time_diff 
               from t90 left join t100 on t90.row_num = t100.row_num  
                      order by date_beg, param_id
)

select * from t110;

--insert into table_report_gas (select * from t110)



Как вставить с такой конструкцией полученные записи в table_report_gas?
Получается, что когда используется конструкция table1 as ( ), то нельзя использовать insert?
Любая критика приветствуется.
iobox
Дата: 24.09.2015 13:58:22
INSERT надо писать до конструкции WITH AS.