SQLiteで不連続の数字の中から30を上端に5個の数字を取得するための下端を求めるSQLを書いてみました。例えば(1,3,5,6,7,8,10,12,20,23,24,25,28,30,31,40)と数字が並んでいた場合、(23,24,25,28,30)がこれを満たすので、下端としては23が該当します。

  SELECT MIN(該当範囲) AS 下端
  FROM (
    SELECT   不連続ID AS 該当範囲
    FROM     検索対象
    WHERE    不連続ID
    ORDER BY 不連続ID DESC
    LIMIT    5 )

サブクエリで求めたい範囲を全件取得しています。WHERE句で30以下という上限の指定を、ORDER BY で不連続IDの降順に並べることで30を上限とする大きい順リストを、LIMIT 5 を指定することで大きい順に5個取得することを指定しています。

このサブクエリの結果得られた該当範囲の最小(MIN)を取ってやれば、求めたい範囲の下端が得られるというわけです。