Tengo una tabla con pocas ID, digamos 100000, 99999, 99998, 1000, 10, 5. Ahora mi requisito es obtener la ID máxima que no se usa.
Data de muestra:
CREATE TABLE foo AS SELECT * FROM ( VALUES (10000),(9999),(9998),(100),(5),(2) ) AS t(id);En el caso anterior, debería ser 99997. ¿Alguna consulta para obtener este ID máximo disponible?
He usado la función lead () para obtener la diferencia entre la identificación actual y la siguiente identificación en orden descendente.
with ct as ( select id, lead(id) over (order by id desc) as nextid from foo ) select id -1 as next_id from ct where id - nextid > 1 order by id desc limit 1; next_id ------- 9997 drop table foo;Rextester aquí
Un método usa left join :
select t.id - 1 from t left join t tprev on t.id = tprev.id + 1 where tprev.id is null order by t.id desc limit 1; Otro usa lag() :
select t.id - 1 from (select t.*, lag(id) over (order by id) as prev_id from t ) t where prev_id <> id - 1 order by id desc limit 1;