我想在序列中找到空白,并按以下方式总结调查结果:
数字序列: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
答案 0 :(得分:0)
这称为群岛和海峡问题。在这里阅读更多内容:
https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/
标题中的“差距”一词指的是价值序列中的差距。 群岛是由间隙划分的完整序列。 '差距和 群岛问题是使用SQL快速检测到不间断的问题 序列,以及列中它们之间的间隙程度。