我正在尝试创建一个程序来:
102100 to 103104该表本身看起来像这样:
| 数量 |
|---|
| 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)
也许这会有所帮助。
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)
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |