0

我在 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 NumberSELECT Coalesce(Number, 1)但它没有用,有什么想法可以解决这个问题吗?

谢谢

4

3 回答 3

5

如果#t是你的桌子

select min(t1.number)+1 
from #t t1
left join #t t2 
           on t1.number = t2.number-1
where t2.number is null
于 2012-07-17T09:31:40.907 回答
1

如果您有一个数字表,其中包含连续的 int 值,那么您可以执行以下操作:

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY iValue) AS Number FROM tblNumbers
) temp
WHERE Number NOT IN 
(
    SELECT [ID] FROM tblFindGaps
)
GO
于 2012-07-17T10:59:18.377 回答
1
SELECT
    t1.number + 1 AS range_start,
    MIN(t2.number) - 1 AS range_end
FROM test t1
INNER JOIN test t2
    ON t2.number > t1.number
WHERE t1.number IS NOT NULL
GROUP BY t1.number
HAVING t1.number + 1 <= MIN(t2.number) - 1

如果15向表中添加一个数字,输出将是:

range_start  range_end
          8          8
         11         14

它找到每对连续的数字,至少有一个间隔。然后它在其中加或减一个,因此start_rangeandend_range是间隙的范围。

于 2012-07-17T10:09:10.770 回答