【发布时间】:2012-07-17 09:27:18
【问题描述】:
我在 SQL Server 数据库表中有一列,有一列包含整数值,我想获得最大值,除非系列中有间隙,然后我想获得第一个缺失值。
例如,从下表中,我希望得到值 4
1
2
null
3
上面很简单,但是如果表中包含如下数据,我怎样才能找到我缺少的 id,在这种情况下它将是 8
1
3
2
4
null
5
7
6
null
10
9
/////////////////
编辑:
我最初实现了@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
)
这很好用,但是如果所有 iValue 字段都为空,那么我什么也得不到,但我希望它返回 1,因为它将是系列中的第一个值,显然我可以在C# 代码,但我确信如果上述查询没有返回一行,则必须有一种返回 1 的方法?
我已将顶级Select Number 更改为SELECT Coalesce(Number, 1),但它不起作用,有什么想法可以解决这个问题吗?
谢谢
【问题讨论】:
-
您似乎在这两个地方都使用了 tblNumbers。在 WHERE 子句中将其更改为包含您在问题中显示的数据的实际表。 tblNumbers 中应该有 1 到 n 个连续的编号。
标签: sql sql-server sql-server-2008-r2