序列中缺少数字的SQL摘要



我想以序列找到差距,并以以下方式汇总发现:

数字序列: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 Server,实际上,该序列将包含更多数字(接近一百万)。我找到了许多脚本,这些脚本在序列中找到并列出了丢失的数字,但是我不知道如何以所需的方式进行总结。

如果有帮助,则该字段称为BELNR,表称为BSEG

编辑:在差距和岛屿材料的帮助下,我能够找到解决方案(可能不是最佳的解决方案,但我认为它有效):

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 

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

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

标题中的"差距"一词是指值序列中的差距。 岛屿是由差距界定的不间断序列。‘差距和 岛屿的问题是使用SQL快速检测到不间断的问题 序列,以及列中它们之间的间隙的程度。

相关内容

  • 没有找到相关文章

最新更新