如何在T-SQL中检查一组数字是否连续?

6

如果我有一个包含n行的整数列的表,想要检查它们是否连续,该怎么做?

DECLARE @Temp TABLE 
(
    IntegerValue INT,
    Processed BIT
)

我有一个解决方案,适用于3行,但这是不灵活的,如果要求改变,那么查询也会改变(忽略我的总和在这种情况下不起作用的事实)。

@SumOfValues = (@FirstValue * @NumOfValues) + @NumOfValues 

对你来说,“数字是连续的”是什么意思?你会假设你的行已经被排序了吗? - Bogdan Sahlean
这些数字按照数值顺序插入到临时表中,如1、2、3、5、66、899等。 - Ant Swift
那么如果源值是1,2,3,100,101,200...会发生什么呢?您想要对连续的行(IntegerValue)进行分组吗? - Bogdan Sahlean
不,如果这些值是1、2、3、100、101、200,那么这些数字并不连续,应该无法通过测试。 - Ant Swift
2个回答

17
SELECT CASE
         WHEN COUNT(DISTINCT IntegerValue) /*Or COUNT(*) dependant on how
                                            duplicates should be treated */ 
                =  1 + MAX(IntegerValue) - MIN(IntegerValue) THEN 'Y'
         ELSE 'N'
       END
FROM   @Temp  

如果您想知道差距在哪里,您可以使用
;WITH T AS
(
SELECT *,
       DENSE_RANK() OVER (ORDER BY IntegerValue) - IntegerValue AS Grp
FROM @Temp
)
SELECT MIN(IntegerValue) AS RangeStart, 
       MAX(IntegerValue) AS RangeEnd
FROM T
GROUP BY Grp
ORDER BY MIN(IntegerValue)

1
我真的很喜欢这个答案。它适用于有重复或没有重复的情况,只要没有间隙。但是我认为,为了使严格的非重复情况起作用,查询应该是:(COUNT(DISTINCT IntegerValue)=1+MAX-MIN) AND (COUNT(*)=1+MAX-MIN) - ypercubeᵀᴹ
哦,我现在明白了。如果IntegerValue是唯一的,那么仅检查COUNT(*)=...就足够了。 - ypercubeᵀᴹ
@ypercube - 是的,我同意。虽然对于非重复情况,我猜测IntegerValue上可能会有一个唯一索引。 - Martin Smith

-1
CREATE TABLE #T(ID INT)
DECLARE @i INT
SET @I = 1
WHILE(@I <= LEN('12235588966'))
BEGIN
  IF(SUBSTRING('12235588966',@i,1) = SUBSTRING('12235588966',@i-1,1))
  BEGIN
        INSERT INTO #T SELECT SUBSTRING('12235588966',@i,1)
  END
  SET @i = @I +1
END

SELECT * FROM #T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接