Как найти пробел в диапазоне в SQL

В этом вопросе объясняется, как найти первый "неиспользованное" число в таблице, но как мне найти такое же, чтобы я мог определить дополнительные ограничения. Как изменить запрос, чтобы получить первое неиспользованное число после того, как оно больше 100

например Если у меня в таблице 23, 56, 100, 101, 103, я должен получить 102.


person Kimvais    schedule 22.07.2013    source источник
comment
Включите условие where mo.id > 100 (в любой из запросов принятого ответа).   -  person    schedule 22.07.2013
comment
какую СУБД вы используете? Постгрес? Оракул?   -  person a_horse_with_no_name    schedule 22.07.2013
comment
В настоящий момент я использую SQLite, но, скорее всего, позже перейду на PostgreSQL.   -  person Kimvais    schedule 22.07.2013


Ответы (5)


в mysql и postgresql

SELECT  id + 1
FROM    test mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    test mi 
        WHERE   mi.id = mo.id + 1
        ) and mo.id> 100
ORDER BY
        id
LIMIT 1

скрипт для mysql и скрипт для postgresql

в ms sql

SELECT  TOP 1
        id + 1
FROM    test mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    test mi 
        WHERE   mi.id = mo.id + 1
        )
          and mo.id > 100
ORDER BY
        id

скрипка

person Praveen Prasannan    schedule 22.07.2013

В Oracle Sql вы можете попробовать:

SELECT id
FROM
     (SELECT ID, lead(ID) OVER(ORDER BY ID) next_val FROM my_table t
     )
WHERE id +1 <> next_val
 AND id      >100;
person ajmalmhd04    schedule 22.07.2013
comment
На самом деле это не относится к Oracle. Он использует стандартную оконную функцию ANSI SQL, которая также работает в Postgres, SQL Server 2012, DB2 и многих других современных СУБД. - person a_horse_with_no_name; 22.07.2013

Надеюсь, что это поможет вам

SELECT MIN (id) + 1
  FROM myTable T1
 WHERE id >= 100
   AND NOT EXISTS (SELECT *
                     FROM myTable T2
                    WHERE T1.id + 1 = T2.id)
person agarici    schedule 22.07.2013
comment
Работает неплохо, за исключением случаев, когда id 101 бесплатный, а 1000 - первое, я получу 1001 по какой-то странной причине .... - person Kimvais; 22.07.2013
comment
В этом случае необходимо заменить id ›100 на id› = 100, как показано в запросе. - person agarici; 22.07.2013

Использование generate_series () для развлечения и получения прибыли:

CREATE table islands (num INTEGER NOT NULL PRIMARY KEY);

INSERT INTO islands (num ) VALUES
(23), (56), (100), (101), (103) ;

WITH total AS (
        SELECT generate_series(mima.bot, mima.top) AS num
        FROM ( SELECT MIN(num) AS bot , MAX(num) AS top FROM islands) mima
        )
SELECT num
FROM total tt
WHERE num >=100
AND NOT EXISTS (
        SELECT *
        FROM islands ii
        WHERE ii.num = tt.num
        )
        ;
person wildplasser    schedule 11.09.2013

использовать это:

SELECT TOP 1 a1.id + 1 FROM test a1 left JOIN test a2 
ON a1.id = a2.id - 1 
WHERE a2.id IS NULL AND a1.id > 100
person aminj    schedule 23.04.2014