Это проблема пробелов и островов. сделать номер строки по идентификатору, затем получить последовательную группу записей.
, затем используйте агрегатную функцию для получения MIN
и MAX
id из этой группы.
MIN(ID) -1
НЕ конец последовательной записи
MAX(ID) + 1
НЕ начало последовательной записи.
окончательное использование LEAD
для получения следующего непоследовательного начального значения записи.
Вы можете попробовать это.
with cte as (
SELECT MIN(ID) -1 startnum,MAX(ID) +1 endnum
FROM (
SELECT id,id - ROW_NUMBER() OVER(ORDER BY id) grp
FROM T
) t1
group by grp
)
SELECT endnum from_gap,to_gap
FROM (
select *,lead(startnum) over(order by startnum) to_gap
from cte
) t1
where t1.to_gap is not null