按序列丢失数字的SQL摘要

时间:2015-05-05 08:22:40

标签: sql sql-server gaps-and-islands number-sequence

我想在序列中找到空白,并按以下方式总结调查结果:

数字序列:2, 3, 4, 8, 9, 12, 13, 14, 15
缺少数字:0, 1, 5, 6, 7, 10, 11
最小数量:0(总是)
最大数量:序列的最大数量(本例中为15)

摘要应如下所示:

From | To | # of missing  
00   | 01 | 2  
05   | 07 | 3  
10   | 11 | 2

我正在使用SQL服务器,实际上,序列将包含更多数字(接近一百万)。我发现很多脚本可以找到并列出序列中缺少的数字,但我无法弄清楚如何以理想的方式对其进行汇总。

如果有帮助,该字段称为BELNR,该表名为BSEG

编辑: 在Gaps and Islands材料的帮助下,我找到了一个解决方案(可能不是最优的解决方案,但我认为它有效):

with C as
(
select belnr, row_number() over(order by belnr) as rownum
from bseg
)
select cast(Cur.belnr as bigint) + 1 as [From], cast(nxt.belnr as bigint) - 1 as [To], (cast(nxt.belnr as bigint) - 1) - (cast(Cur.belnr as bigint) + 1) + 1  as [# of Missing]
from C as Cur
join C as Nxt
    on Nxt.rownum = cast(Cur.rownum as int) +1
Where cast(nxt.belnr as bigint) - cast(Cur.belnr as bigint) > 1 

1 个答案:

答案 0 :(得分:0)

这称为群岛和海峡问题。在这里阅读更多内容:

https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/

  

标题中的“差距”一词指的是价值序列中的差距。   群岛是由间隙划分的完整序列。 '差距和   群岛问题是使用SQL快速检测到不间断的问题   序列,以及列中它们之间的间隙程度。