私はメッセージベースのシステムを管理しています。このシステムでは、一意の整数IDのシーケンスが一日の終わりに完全に表されますが、必ずしも順番に到着するとは限りません。
SQLを使用して、このシリーズで欠落しているIDを見つけるためのヘルプを探しています。列の値が次のようなものである場合、このシーケンスで欠落しているIDを見つけるにはどうすればよいですか?この場合はどうすればよい6
ですか?
シーケンスは毎日任意の時点で開始および終了するため、実行ごとに最小値と最大値が異なります。Perlのバックグラウンドから来て、そこにある正規表現を使用します。
ids
1
2
3
5
4
7
9
8
10
助けていただければ幸いです。
編集:オラクルを実行します
Edit2:ありがとう。来週、オフィスでソリューションを実行します。
Edit3:とりあえず、ORIG_IDが元のID列、MY_TABLEがソーステーブルのようなものに落ち着きました。私のデータを詳しく見ると、文字列内の数値データだけでなく、さまざまなケースがあります。場合によっては、数字以外の文字の接頭辞または接尾辞があります。その他の場合、数値IDにダッシュまたはスペースが混在しています。これを超えて、IDは定期的に複数回表示されるため、個別に含めました。
特に非数字文字を取り除く最良のルートに関して、さらに入力をいただければ幸いです。
SELECT
CASE
WHEN NUMERIC_ID + 1 = NEXT_ID - 1
THEN TO_CHAR( NUMERIC_ID + 1 )
ELSE TO_CHAR( NUMERIC_ID + 1 ) || '-' || TO_CHAR( NEXT_ID - 1 )
END
MISSING_SEQUENCES
FROM
(
SELECT
NUMERIC_ID,
LEAD (NUMERIC_ID, 1, NULL)
OVER
(
ORDER BY
NUMERIC_ID
ASC
)
AS NEXT_ID
FROM
(
SELECT
DISTINCT TO_NUMBER( REGEXP_REPLACE(ORIG_ID,'[^[:digit:]]','') )
AS NUMERIC_ID
FROM MY_TABLE
)
) WHERE NEXT_ID != NUMERIC_ID + 1