2

次の表があるとします。

create table #myvalues(mykey int primary key)

次の値もあります。

insert into #myvalues(mykey) values(1)
insert into #myvalues(mykey) values(2)
insert into #myvalues(mykey) values(4)
insert into #myvalues(mykey) values(5)
insert into #myvalues(mykey) values(6)
insert into #myvalues(mykey) values(8)
insert into #myvalues(mykey) values(10)
insert into #myvalues(mykey) values(11)
insert into #myvalues(mykey) values(12)
insert into #myvalues(mykey) values(15)
insert into #myvalues(mykey) values(17)
insert into #myvalues(mykey) values(20)

現在の値もあります。

declare @currentvalue int

select @currentvalue = 5

@currentvalue の後に発生するこのシーケンスの最初のブレークを見つけたいと考えています。この場合、答えは 7 になります。

テーブル変数を使用して、while ループを使用してレコードをスピンすることもできますが、もっと良い方法があるはずです。

助言がありますか?

4

3 に答える 3

4
WITH list
AS
(
    SELECT  myKey,
            ROW_NUMBER() OVER (ORDER BY myKey ASC) rn
    FROM    #myvalues
)
SELECT  TOP 1 rn
FROM    list
WHERE   myKey <> rn

これが取り上げるクエリですstarting value

DECLARE @currentValue INT 
SET @currentValue = 5

;WITH list
AS
(
    SELECT  myKey,
            ROW_NUMBER() OVER (ORDER BY myKey ASC) + (@currentValue - 1) rn
    FROM    myvalues
    WHERE   myKey >= @currentValue 
)
SELECT  TOP 1 rn 
FROM    list
WHERE   myKey <> rn
于 2013-02-26T15:15:45.590 に答える
2
select top 1 myKey+1 from #myvalues
where 
    (myKey+1) not in (select mykey from #myvalues)
    and mykey >= @currentValue
于 2013-02-26T15:22:00.040 に答える
2

テーブルをそれ自体と結合できます。

select top 1 t.mykey + 1
from myvalues t
left join myvalues x on x.mykey = t.mykey + 1
where t.mykey > @currentvalue and x.mykey is null
order by t.mykey

デモ: http://www.sqlfiddle.com/#!2/c6dd2/7

于 2013-02-26T15:18:42.980 に答える