Вы можете использовать иерархический запрос:
Установка Oracle :
CREATE TABLE master_table ( line_value, tel_num ) AS
SELECT 'V1', '023158100001' FROM DUAL UNION ALL
SELECT 'V1', '023158100002' FROM DUAL UNION ALL
SELECT 'V1', '023158100003' FROM DUAL UNION ALL
SELECT 'V1', '023158100004' FROM DUAL UNION ALL
SELECT 'V2', '023158115645' FROM DUAL UNION ALL
SELECT 'V2', '023158111546' FROM DUAL UNION ALL
SELECT 'V2', '023158111547' FROM DUAL UNION ALL
SELECT 'V2', '023158111617' FROM DUAL UNION ALL
SELECT 'V3', '023158121110' FROM DUAL UNION ALL
SELECT 'V3', '023158121111' FROM DUAL UNION ALL
SELECT 'V3', '023158121112' FROM DUAL;
Запрос 1 :
SELECT CONNECT_BY_ROOT( tel_num ) AS start_num,
tel_num AS end_num,
line_value
FROM master_table m
WHERE CONNECT_BY_ISLEAF = 1
START WITH NOT EXISTS (
SELECT 1
FROM master_table p
WHERE m.line_value = p.line_value
AND TO_NUMBER( m.tel_num ) - 1 = TO_NUMBER( p.tel_num )
)
CONNECT BY PRIOR line_value = line_value
AND PRIOR TO_NUMBER( m.tel_num ) + 1 = TO_NUMBER( m.tel_num )
ORDER BY line_value, start_num;
выход
START_NUM END_NUM LINE_VALUE
------------ ------------ ----------
023158100001 023158100004 V1
023158111546 023158111547 V2
023158111617 023158111617 V2
023158115645 023158115645 V2
023158121110 023158121112 V3