【问题标题】:SQL summary of missing numbers in sequence序列中缺失数字的SQL总结
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,这就是我要找的东西
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 2012-10-15
  • 2019-03-21
  • 1970-01-01
  • 2011-11-11
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多