查找连续序列并建议序列中的下一个数字

Jus*_*tin 3 sql sql-server

我正在尝试创建一个程序来:

  • 接受任何数字作为输入,例如102
  • 找到它所属的序列范围,例如100 to 103
  • 返回建议的下一个号码给用户,例如104

该表本身看起来像这样:

数量
100
101
102
103
110
111
112
113
114
115
120
121

理想情况下,查询的输出将返回如下内容:

开始 结尾 下一个编号
100 103 104
110 115 116
120 121 122

我正在尝试做的事情与某种间隙和岛屿技术有关。我想从这里尝试一些东西,但无法完全发挥作用。 间隙和岛屿链接

这就是我尝试想出的...

WITH cteSource(ID, Seq, Num)
AS(
    SELECT d.ID, f.Seq, f.Num
    FROM (
        SELECT 
            ID,
            ROW_NUMBER() OVER (PARTITION BY ID ORDER BY MIN(SeqNo)) AS Grp,
            MIN(SeqNo) AS StartSeqNo,
            MAX(SeqNo) AS EndSeqNo
        FROM
            (
            SELECT 1 ID, Num SeqNo, 
               Num - ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY Num) AS RN
            FROM 
            Number
            ) AS a
        GROUP BY ID, RN
        ) d
    CROSS APPLY (
            VALUES (d.Grp, d.EndSeqNo + 1),(d.Grp -1, d.StartSeqNo -1)
            ) AS f(Seq, Num)
)
SELECT ID, MIN(Num) AS StartSeqNo, MAX(Num) AS EndSeqNo, MAX(Num) + 1 as NextNr
FROM cteSource
GROUP BY ID, Seq
HAVING COUNT(*) = 2
Run Code Online (Sandbox Code Playgroud)

结果如下:

起始序列号 结束序列号 下一个号码
104 109 110
116 119 120

这是设置:

CREATE TABLE [dbo].[Number](
    [Num] [int] NULL
) 
GO

INSERT INTO Number
(Num)
VALUES
(100),
(101),
(102),
(103),
(110),
(111),
(112),
(113),
(114),
(115),
(120),
(121)
Run Code Online (Sandbox Code Playgroud)

Joh*_*tti 6

也许这会有所帮助。

Select [Start]  = min(num)
      ,[End]    = max(num)
      ,[NextNr] = max(num) + 1
 From (
        Select * 
              ,Grp = num - row_number() over (order by num)
         From  number
      ) A
 Group By Grp
Run Code Online (Sandbox Code Playgroud)

结果

Start   End     NextNr
100     103     104
110     115     116
120     121     122
Run Code Online (Sandbox Code Playgroud)

  • 那真是……太棒了! (2认同)
  • @Justin如果 NextNr 可以运行到下一个序列,这意味着那里没有间隙,并且结果序列看起来不会像那样。 (2认同)