Mit LEAD
analytische Funktion können Sie die Nummer aus der nächsten Reihe aufsteigend erhalten. Vergleicht man diesen Wert mit der ursprünglichen Nummer um 1 erhöht man die fehlenden Werte (wenn zwei Zahlen nicht übereinstimmen).
zu dem ersten fehlenden Wert aufsteigend erhalten das gleiche ist, den MIN
Wert Auswahl:
select
num,
lead(num) over (order by num) num_lead,
case when num + 1 != lead(num) over (order by num) then num + 1 end as missing_num
from test_data
order by num;
NUM NUM_LEAD MISSING_NUM
---------- ---------- -----------
4 5
5 6
6 9 7
9 10
10 13 11
13
-- first missing number = MIN missing number
select min(missing_num)
from (
select
case when num + 1 != lead(num) over (order by num) then num + 1 end as missing_num
from test_data
);
MIN(MISSING_NUM)
----------------
7
NACHTRAGS
Eine gute Praxis SQL in schriftlicher Form ist Rand Fälle zu betrachten - hier eine Tabelle das enthält ein komplettes Intervall ohne Löcher. Der erste fehlende Wert wird der Nachfolger der letzten Nummer sein.
select nvl(min(missing_num),max(num)+1) first_missing_value
from (
select
num,
case when num + 1 != lead(num) over (order by num) then num + 1 end as missing_num
from test_data
);
Eine vollständige Tabelle keine MISSING_NUM
zurückkehren, so die ursprüngliche Abfrage Rückkehr NULL
. Unter Verwendung des NVL
wird das erwartete Ergebnis bereitgestellt.
Minimale fehlende Nummer wo? Bei Null? Oder an der Mindestanzahl, die momentan in der Tabelle ist? –
@DavidFaber - Letzteres (nach dem Code der OP gebucht). – mathguy
@mathguy ... und auf leere Tabelle gibt 'NULL' zurück - um zu vermeiden, * negative Unendlichkeit * :) –