一連のギャップを見つけて、その結果を次のように要約したいと思います。
数列: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 サーバーを使用していますが、実際には、シーケンスにはさらに多くの数字 (100 万近く) が含まれます。シーケンス内の欠落した数字を見つけてリストするスクリプトをたくさん見つけましたが、それを望ましい方法で要約する方法がわかりません。
それが役立つ場合は、フィールドが呼び出され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