запросить первый доступный слот postgres - PullRequest
1 голос
/ 03 августа 2020

У меня есть таблица с именем chest

chest_id integer NOT NULL
index integer NOT NULL

Я могу получить следующий индекс, запросив

select max(index) + 1 from chest group by chest_id

В случае, если в порядке есть какой-то индекс, который не заполнен , как его получить? например:

chest_id | index
       0 |     0
       1 |     1
       2 |     2
       1 |     4

Как мне запросить возврат первого доступного индекса? в приведенном выше примере это было бы 3. Но если бы он был заполнен, следующим доступным было бы 5

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать оконные функции:

select idx + 1
from (select idx, lead(idx) over(order by idx) lead_idx from chest) t
where idx + 1 is distinct from lead_idx 

Это дает вам первое доступное idx в таблице (либо пробел, либо наибольшее значение + 1).

Примечание что index - ключевое слово языка, поэтому не подходит для имени столбца. Я переименовал его в idx.

Другой вариант - not exists:

select c.idx + 1
from chest c
where not exists (select 1 from chest c1 where c1.idx = c.idx + 1)
...