t-sql найти минимальное значение - PullRequest
3 голосов
/ 29 декабря 2011

Как найти минимальное значение среди значений, которые не заполнены или не существуют

, например

001  
002  
003
013
015

результат должен вернуть 004

выберите мин

Ответы [ 5 ]

3 голосов
/ 29 декабря 2011
declare @T table(Number int)

insert into @T values (1),(2),(3),(13),(15)

select top 1 Number + 1
from @T
where Number + 1 not in (select Number from @T)
order by Number

Обновление:

Версия с использованием char (3) с добавлением нуля.

declare @T table(ID char(3))

insert into @T values ('001'),('002'),('003'),('013'),('015')

select top 1 right(1001 + Id, 3)
from @T
where Id + 1 not in (select Id from @T)
order by Id
1 голос
/ 02 января 2012

Это похоже на , что @szauri предложило , но без агрегирования:

;
WITH ranked AS (
  SELECT n, r = ROW_NUMBER() OVER (ORDER BY n)
  FROM @T
)
SELECT TOP 1 r
FROM ranked
WHERE n <> r
ORDER BY n

Примечание: и для @ szauri, и для моих решений требуется SQL Server 2005 или более поздняя версия.

1 голос
/ 30 декабря 2011

Попробуйте это (без объединений, без записи)

declare @T table(n int)

insert into @T values (1),(2),(3),(13),(15)


select max(n)+1 from (
  select *,l=n-row_number() over(order by n)  
    from (
      select n from @T
      union
      select 0 -- what about 0 ??
    ) as s
) as a
where l=-1
1 голос
/ 29 декабря 2011

Предполагая вашу последовательность в таблице YourNumbersTable Попробуйте это (SQL Server 2005 +):

declare @min int, @max int
select @min = MIN(Id), @max = MAX(Id) from YourNumbersTable

;WITH numbers(id) as
(
    SELECT @min id
    UNION ALL 
    SELECT id+1
    FROM numbers
    WHERE id <= @max
)

SELECT MIN(Numbers.id)
FROM Numbers
     LEFT JOIN YourNumbersTable ON Numbers.Id = YourNumbersTable.Id
WHERE YourNumbersTable.Id IS NULL
OPTION(MAXRECURSION 0)
0 голосов
/ 29 декабря 2011

возможно у меня есть альтернативное решение.Это может быть медленнее в широких диапазонах номеров из-за цикла в нем.

-- prepare a table to have your example 
declare @ref table (id int)
insert into @ref (id) values (1), (2), (3), (13), (15)

-- this will return 1
select min(id) from @ref

-- magic happens here
declare @i int, @max int, @returnValue int
select @i = min(id), @max = max(id) from @ref
declare @tmp table (id int)
while @i <= @max
    begin
    insert into @tmp (id) values (@i)
    set @i = @i + 1
    end

select @returnValue = min(t.id) 
    from @tmp t left outer join @ref r on t.id = r.id
    where r.id is null

-- this will return 4
select @returnValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...