Найти доступный диапазон из таблицы в SQL Server
У меня есть таблица, которая содержит столбцы Start и End, как INT
. Мне нужно найти самый первый доступный диапазон N
сравнению с существующими данными.
Таблица Схема :
CREATE TABLE [dbo].[MSRange] ( [RangeId] [int] IDENTITY(1,1) NOT NULL, [RangeStart] [int] NOT NULL, [RangeEnd] [int] NOT NULL, CONSTRAINT [PK_MSRange] PRIMARY KEY CLUSTERED ([RangeId] ASC) ) ON [PRIMARY]
Данные пробного семени:
- Как группировать по столбцу - SQL Server
- SQL Server всегда зашифрован с .NET Core несовместим
- SQL Server: добавление внешнего ключа на несколько столбцов
- Аудит базы данных SQL Server выбирает, не удалось выполнить логин и выполнил код для всей базы данных, все объекты
- OPENQUERY выбрасывает ошибку «Недостаточно памяти»: ограничивайте строки до тех пор, пока все не будут загружены
INSERT INTO [dbo].[MSRange] ([RangeStart], [RangeEnd]) VALUES (1, 150), (1250, 1500), (3100, 7500), (10500, 15000);
Требование:
Мне нужно найти заполнитель для 1000 слотов, очевидно, из данных семян можно сказать, что доступно 151-1150. Аналогично для 1500 слотов доступно 1501-3000.
Пожалуйста, помогите мне, как получить первый доступный заполнитель.
- Архив файлов расширенных событий с хранилищем Azure blob
- Объединение и объединение нескольких таблиц
- SQL Получить первое значение из таблицы
- SQL Server 2016 - Динамическая маска данных (DDM)
- Создать нулевой числовой столбец в компоненте Derived column
- DATEDIFF SQL Server 2016 JSON
- Как выбрать все значения параметров в SSRS?
- Изменение столбца от NULL до NOT NULL при вставке некоторых данных
declare @MSRange table ( [RangeId] [int] IDENTITY(1,1) NOT NULL primary key, [RangeStart] [int] NOT NULL, [RangeEnd] [int] NOT NULL ) INSERT INTO @MSRange ([RangeStart], [RangeEnd]) VALUES (1, 150), (1250, 1500), (3100, 7500), (10500, 15000); declare @N int = 1000; with cte as ( select RangeId, RangeEnd as result_range_start, isnull(lead(RangeStart) over(order by RangeId), 2147483647) as result_range_end from @MSRange ) select top 1 result_range_start + 1, result_range_start + @N from cte where result_range_end - result_range_start > @N order by RangeId;
Этот код предназначен для версий начиная с 2012
. Для @@version
<= 2008 R2
такая же идея, но используйте row_number()
для присоединения, а затем текущий с предыдущим