Для примеров данных, посмотрите, поможет ли это (прочитайте комментарии в коде):
SQL> with
2 aql (id, type, size_from, size_to) as
3 -- Your current data
4 (select 68, 'NORMAL' , 2, 150 from dual union all
5 select 69, 'NORMAL' , 501, 1200 from dual union all
6 select 70, 'REDUCED', 1201, 3200 from dual union all
7 select 71, 'REDUCED', 151, 500 from dual
8 ),
9 existing_sizes as
10 -- list all existing sizes, one-by-one, per type
11 (select type, size_from + column_value - 1 csize
12 from aql cross join table(cast(multiset(select level from dual
13 connect by level <= size_to - size_from + 1
14 ) as sys.odcinumberlist))
15 ),
16 minmax as
17 -- find MIN and MAX size valze per type - will be used in ALLSIZES CTE
18 (select type, min(size_from) size_from, max(size_to) size_to
19 from aql
20 group by type
21 ),
22 allsizes as
23 -- list all sizes (per type) between MIN and MAX value
24 (select type, size_from + column_value - 1 csize
25 from minmax cross join table(cast(multiset(select level from dual
26 connect by level <= size_to - size_from + 1
27 ) as sys.odcinumberlist))
28 ),
29 missing_sizes as
30 -- missing sizes can be found with MINUS set operator
31 (select a.type, a.csize from allsizes a
32 minus
33 select e.type, e.csize from existing_sizes e
34 )
35 -- the final result
36 select type, min(csize) size_from, max(csize) size_to
37 from missing_sizes
38 group by type;
TYPE SIZE_FROM SIZE_TO
------- ---------- ----------
NORMAL 151 500
REDUCED 501 1200
SQL>
Это не удастся, однако, если будет больше пробелов (но это не то, что предлагают ваши примерные данные).