【发布时间】: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 或更多缺失数字的范围,因此将它们全部列出是没有意义的。误会见谅
标签: sql sql-server gaps-and-islands number-sequence