【问题标题】:How can I check a group of numbers are consecutive in T-SQL?如何在 T-SQL 中检查一组数字是否连续?
【发布时间】:2016-06-13 14:06:07
【问题描述】:

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

DECLARE @Temp TABLE 
(
    IntegerValue INT,
    Processed BIT
)

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

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

【问题讨论】:

  • “数字是连续的”对你来说意味着什么?您以某种方式假设您的行是有序的?
  • 数字按数字顺序 1, 2, 3, 5, 66, 899, ... 插入到临时表中
  • 那么如果源值是 1,2,3, 100,101,200 ... 会发生什么?你想group连续行(IntegerValue)吗?
  • 否,如果值为 1,2,3,100,101,200,则这些数字不连续,应该无法通过测试。

标签: sql-server tsql


【解决方案1】:
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)

【讨论】:

  • 我真的很喜欢这个答案。只要没有间隙,它在是否存在重复时都有效。但我认为要使严格的非重复案例起作用,查询应该是:(COUNT(DISTINCT IntegerValue)=1+MAX-MIN) AND (COUNT(*)=1+MAX-MIN)
  • 哦,我现在看到了曙光。如果IntegerValue 是唯一的,那么只检查COUNT(*)=... 就足够了。
  • @ypercube - 是的,同意。尽管对于不重复的情况,我想很有可能在IntegerValue 上无论如何都会有一个唯一索引。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 2020-03-22
    • 2018-12-20
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多