Как проверить на наличие разрывов нумерации в БД (SQL)?
Имеется таблица, упрощённо в ней есть поле number, в который от пользователя поступают номера.
Первый вопрос:
Требуется проверить, чтобы номера были указаны без разрывов в диапазоне, например:
1, 2, 3, 4, 5 - правильно
1, 3, 2, 4, 5 - правильно (хоть и не по порядку, но диапазон 1-5 полный)
1, 2, 4, 5 - не правильно (есть разрыв, пропущено 3)
Второй вопрос: добавляем к таблице поле range_id и надо посчитать количество непрерывных диапазонов в загружаемых данных и пометить для каждого number порядковый номер диапазона
1, 2, 3, 4, 5 - один непрерывный диапазон (1 - 5), везде ставим 1
1, 2, 3, 5, 6, 7 - два непрерывных диапазона (1- 3, 5 - 7), на номера 1-3 ставим 1, на 5-7 ставим 2
1, 3, 7, 4, 6 - три непрерывных диапазона (1, 3-4, 6-7) на 1 ставим 1, на 3-4 ставим 2, на 6-7 ставим 3
идея для второго вопроса
1. номера диапазонов не по порядку идут:
2. сколько записей в таблице?
create table #t (ID int IDENTITY (1, 1),number int,d int)
insert into #t (number) select number from [source_table] order by number
update #t set d=number-ID
По второму вопросу, кому интересно, допёр вот до этого:
SELECT number, DENSE_RANK() OVER(ORDER BY DIFF ASC) range_id
FROM
(
SELECT [number], [number] - DENSE_RANK() OVER(ORDER BY [number] ASC) DIFF
FROM [TestSet]
) t
ORDER BY [number]
второй ответ:
declare @i int
set @i=1
update [tbl] set range_id=@i,@i=@i+case when isnull([tbl].number-(select max(t.number) from [tbl] as t where t.number<[tbl].number),1)>1 then 1 else 0 end where number in (select top 100000 number from [tbl] order by number)
select * from [tbl]
или без сортировки
update [tbl] set range_id=@i,@i=@i+case when isnull([tbl].number-(select max(t.number) from [tbl] as t where t.number<[tbl].number),1)>1 then 1 else 0 end