【问题标题】:How to get first gap in a column containing sequential int values如何在包含连续 int 值的列中获取第一个间隙
【发布时间】: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


【解决方案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

【讨论】:

    【解决方案2】:

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

    SELECT * FROM 
    (
        SELECT ROW_NUMBER() OVER(ORDER BY iValue) AS Number FROM tblNumbers
    ) temp
    WHERE Number NOT IN 
    (
        SELECT [ID] FROM tblFindGaps
    )
    GO
    

    【讨论】:

    • 谢谢,尽管这不太正确,但我认为这是一个更好的解决方案,因为如果表中有很多行,它比@podiluska 的答案更快。这不能处理我们可以在其中包含多行具有空值的事实。我会解决这个问题并在下面发布我自己的答案。
    【解决方案3】:
    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_rangeend_range 就是间隙的范围。

    【讨论】:

      猜你喜欢
      • 2019-12-21
      • 2021-08-31
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多