Если я правильно понял ваше требование, то, возможно, так оно и будет:
FSITJA@db01 2019-07-08 12:08:59> with table1(tran_id, user_id, start_date, end_date) as (
2 select 1, 100, date '2018-06-01', date '2018-06-18' from dual union all
3 select 2, 100, date '2018-06-14', date '2018-06-14' from dual union all
4 select 4, 100, date '2018-07-19', date '2018-07-19' from dual union all
5 select 7, 101, date '2018-01-05', date '2018-01-06' from dual union all
6 select 9, 101, date '2018-01-08', date '2018-01-08' from dual union all
7 select 3, 101, date '2018-01-03', date '2018-01-03' from dual )
8 select rownum as my_id,
9 tran_id as transidfrom,
10 next_tran_id as transidto,
11 end_date as transidfrom_end_date,
12 next_end_date as transidto_start_date,
13 datediff
14 from (select tran_id,
15 user_id,
16 start_date,
17 end_date,
18 lead(tran_id) over (partition by user_id order by end_date) next_tran_id,
19 lead(start_date) over (partition by user_id order by end_date) next_end_date,
20 lead(start_date) over (partition by user_id order by end_date) - end_date datediff
21 from table1)
22 where datediff > 0;
MY_ID TRANSIDFROM TRANSIDTO TRANSIDFROM_END_DAT TRANSIDTO_START_DAT DATEDIFF
---------- ----------- ---------- ------------------- ------------------- ----------
1 1 4 2018-06-18 00:00:00 2018-07-19 00:00:00 31
2 3 7 2018-01-03 00:00:00 2018-01-05 00:00:00 2
3 7 9 2018-01-06 00:00:00 2018-01-08 00:00:00 2
3 rows selected.
Пример SQL Fiddle