Это должно сработать: SQL Fiddle
declare @ticketsTable table (ticketNo int not null)
insert @ticketsTable (ticketNo) values (1),(2),(4),(7),(11)
;with cte1(ticketNo, isMissing, sequenceNo) AS
(
select ticketNo
, 0
, row_number() over (order by ticketNo)
from @ticketsTable
)
, cte2(ticketNo, isMissing, sequenceNo) AS
(
select ticketNo, isMissing, sequenceNo
from cte1
union all
select a.ticketNo + 1
, 1
, a.sequenceNo
from cte2 a
inner join cte1 b
on b.sequenceNo = a.sequenceNo + 1
and b.ticketNo != a.ticketNo + 1
)
select *
from cte2
where isMissing = 1
order by ticketNo
Работает, собирая все существующие заявки, помечая их как существующие и присваивая каждому подряд номер, дающий их заказ в оригинальном списке.
Затем мы можем увидеть пропуски в списке, найдя все места, где порядковый номер заказа показывает следующую запись, но номера билетов не являются последовательными.
Наконец, мы рекурсивно заполняемпробелы;работа с начала промежутка и добавление новых записей до тех пор, пока в последовательных номерах этого промежутка больше не будет пробела между связанными номерами заявок.