03U*_*Usr 0 sql sql-server sql-server-2008-r2
我在SQL Server数据库表中有一个列,有一个包含整数值的列,我希望得到最大值,除非系列中有间隙,然后我想获得第一个缺失值.
例如,从下表,我希望获得价值4
1
2
null
3
Run Code Online (Sandbox Code Playgroud)
以上很简单,但是如果表中包含如下数据,我怎样才能找到我遗漏的id,在这种情况下它将是8
1
3
2
4
null
5
7
6
null
10
9
Run Code Online (Sandbox Code Playgroud)
//////////////////
编辑:
我最初实现了@ podiluska的答案,并且接受了它然而当我用超过10K行的表进行测试时它非常慢,所以我已经采取@vmvadivel的答案并稍微改变它,如下所示,它的工作速度非常快,但仍然不是100%我想要的:
SELECT Number
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY iValue) AS Number
FROM tblNumbers WHERE iValue IS NOT NULL
) temp
WHERE Number NOT IN
(
SELECT iValue FROM tblNumbers WHERE iValue IS NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
这很好用但是如果所有的iValue字段都是null然后我什么都没有回来,但我希望它返回1,因为它将是系列中的第一个值,显然我可以在C#代码中处理这个但我确定如果上面的查询没有返回一行,必须有一种方法返回1?
我已经改变了顶层Select Number用SELECT Coalesce(Number, 1),但它没有工作,任何想法如何解决这个问题?
谢谢
如果#t是你的桌子
select min(t1.number)+1
from #t t1
left join #t t2
on t1.number = t2.number-1
where t2.number is null
Run Code Online (Sandbox Code Playgroud)