@cicatrix
было бы большой ошибкой думать

Как проверить на наличие разрывов нумерации в БД (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

P. S. всё в MS-SQL
  • Вопрос задан
  • 1575 просмотров
Решения вопроса 1
@cicatrix Автор вопроса
было бы большой ошибкой думать
По второму вопросу, кому интересно, допёр вот до этого:
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]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@pool
второй ответ:
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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы