序列中缺失数字的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总结的主要内容,如果未能解决你的问题,请参考以下文章