序列中缺失数字的SQL总结

Posted

技术标签:

【中文标题】序列中缺失数字的SQL总结【英文标题】:SQL summary of missing numbers in sequence 【发布时间】:2015-05-05 08:22:39 【问题描述】:

我想找出一个序列中的空白,并按以下方式总结发现:

编号顺序:2, 3, 4, 8, 9, 12, 13, 14, 15 缺少号码:0, 1, 5, 6, 7, 10, 11 最小数:0(始终) max number:序列的最大数量(本例中为 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 

【问题讨论】:

您的输出看起来不正确。 from 和 To 具有缺失数字的值 您说“我找到了许多脚本,这些脚本可以找到并列出序列中缺失的数字” ...请包括该信息以及它使用上述数据集产生的内容,这将表明您有一个部分解决方案,并且您希望将输出格式化为摘要。否则,当您已经拥有第一部分时,您将依赖用户为您创建 2 个解决方案。 @ughai:我想显示差距(缺失值) Tanner:我已经发布了我上面使用的代码 我的观点完全正确。您缺少值 5,6 和 7,但是您有一行 05 | 07 | 3。你是如何决定得到 5 和 7 并从你的输出中排除 6 它的意思是一个范围 - 从 5 到 7,其中包括数字 5、6、7(因此缺失的数量是 3)。在现实世界的示例中,我缺少 10k 或更多缺失数字的范围,因此将它们全部列出是没有意义的。误会见谅 【参考方案1】:

这称为孤岛和差距问题。在这里阅读更多:

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

标题中的“间隙”一词是指值序列中的间隙。 岛屿是由间隙分隔的完整序列。 “差距和 Islands 的问题是使用 SQL 快速检测未损坏的 序列,以及它们在列中的间隙程度。

【讨论】:

谢谢,这就是我要找的东西

以上是关于序列中缺失数字的SQL总结的主要内容,如果未能解决你的问题,请参考以下文章

给定一个数字序列如何识别缺失的数字

时间序列数据的预处理方法总结

如何在一个序列中找到缺失的数字?

从序列中为配置单元中的每个值查找缺失的数字

268. 缺失数字

序列总结