As allways in such situations, analytical functions rock!
In the above query/output, column DIFF shows absolute difference between close and open (in hours), while NONOVERLAP_DIFF shows only that part of time difference that was not allready covered by previous interval.Code:SQL> desc date_test Name Null? Type ----------------------------------------------------------------- -------- ------- ID NUMBER OPEN DATE CLOSE DATE SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi'; Session altered. SQL> select * from date_test order by open; ID OPEN CLOSE --- ----------------- ----------------- 1 01-jan-2003 10:30 02-jan-2003 22:30 2 02-jan-2003 11:30 03-jan-2003 10:30 3 03-jan-2003 08:00 03-jan-2003 09:00 4 03-jan-2003 10:00 03-jan-2003 14:00 5 03-jan-2003 12:00 03-jan-2003 18:00 SQL> alter session set nls_date_format = 'dd-mon hh24:mi'; Session altered. SQL> select id, open, close, 2 prev_open, prev_close, 3 (close - open)*24 as diff, 4 greatest(0,(close - greatest(open, prev_close)))*24 as nonoverlap_diff 5 from 6 (select id, open, close, 7 lag(open, 1, open) over (order by open) as prev_open, 8 lag(close, 1, open) over (order by open) as prev_close 9 from date_test 10 ) 11 order by open; ID OPEN CLOSE PREV_OPEN PREV_CLOSE DIFF NONOVERLAP_DIFF --- ------------ ------------ ------------ ------------ ----- --------------- 1 01-jan 10:30 02-jan 22:30 01-jan 10:30 01-jan 10:30 36 36 2 02-jan 11:30 03-jan 10:30 01-jan 10:30 02-jan 22:30 23 12 3 03-jan 08:00 03-jan 09:00 02-jan 11:30 03-jan 10:30 1 0 4 03-jan 10:00 03-jan 14:00 03-jan 08:00 03-jan 09:00 4 4 5 03-jan 12:00 03-jan 18:00 03-jan 10:00 03-jan 14:00 6 4




Reply With Quote