powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить ближайшее число отсутствующее в последовательности
23 сообщений из 23, страница 1 из 1
Получить ближайшее число отсутствующее в последовательности
    #39773145
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с номерами Таблица(int Number)

Она содержит набор случайных чисел, скажем 1,2,3,4,5,7,9,12,13...

Как можно получить ближайшее отсутствующее число? В данном примере будет 6. Таблица может быть большой, скажем миллион записей
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773147
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessyp,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as (select * from (
values
(1),(2),(3),(4),(5),(7),(9),(12),(13))v(n)
)

select top(1) n + 1
  from t t0
where not exists(select null from t t1 where t1.n = t0.n + 1)
order by n
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773154
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypВ данном примере будет 6.Каким должен быьт результат, если отсутствует запись со значением 1?
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773242
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер, спасибо. Если 1 отсутствует, то должен быть 1, но это можно разрулить принудительным добавлением нуля в таблицу при ее создании
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773256
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypэто можно разрулить принудительным добавлением нуля в таблицу при ее созданииПросто переверни условие и добавь ограничение >0.
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773449
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
with t as (select *
           from (values (1), (2), (3), (4), (5), (7), (9), (12), (13)) v(n)),
     a as (select n, row_number() over (order by n) rn from t)
select top(1) rn from a where n > rn order by n;

rn6
Код: sql
1.
2.
3.
4.
with t as (select *
           from (values (10), (2), (30), (40), (5), (7), (9), (12), (13)) v(n)),
     a as (select n, row_number() over (order by n) rn from t)
select top(1) rn from a where n > rn order by n;

rn1
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773650
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypЕсли 1 отсутствует, то должен быть 1, но это можно разрулить принудительным добавлением нуля в таблицу при ее созданииЗачем в таблицу добавлять ноль, если можно добавить единицу в запрос?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as (select * from (
values
(3),(4),(5),(7),(9),(12),(13))v(n)
)

select top(1) n 
  from (
         --- Просто добаввь ... ... один ;) :) :
         select 1 as n where not exists(select null from t t2 where n = 1)
          union all
         select top(1) n + 1
           from t t0
          where not exists(select null from t t1 where t1.n = t0.n + 1)
          order by n
       ) v
 order by n
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773653
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем спасибо, замечательно

andrey odegov
Код: sql
1.
(select n, row_number() over (order by n) rn from t)



я так думаю ваш вариант на большой таблице сьест много памяти т.к. все миллионы записей затянутся в память
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773670
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверим?
Возьмем 10 000 000 миллионов строк, сделаем дыру в районе 4 000 000 миллионов.
Выполняем здесь https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=37d75a987970762218a55792eadc5ca3.
План здесь https://www.brentozar.com/pastetheplan/?id=Skf1w_zrE.
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773679
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypя так думаю ваш вариант на большой таблице сьест много памяти т.к. все миллионы записей затянутся в памятьТолько в случае, если поле с числами неиндексировано - да и то, "затянутся в память" не все записи, а только это поле, для сортировки.
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773705
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey odegovПроверим?
Возьмем 10 000 000 миллионов строк, сделаем дыру в районе 4 000 000 миллионов.
Выполняем здесь https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=37d75a987970762218a55792eadc5ca3.
План здесь https://www.brentozar.com/pastetheplan/?id=Skf1w_zrE.
главное что бы в "набор случайных чисел" не сложилось одинаковых
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773719
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заменить на dense_rank:
Код: sql
1.
2.
3.
4.
with t as (select *
           from (values (1), (2), (3), (4), (4), (5), (7), (9), (12), (13)) v(n)),
     a as (select n, dense_rank() over (order by n) rn from t)
select top(1) rn from a where n > rn order by n;

rn6
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773721
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
with t as (select *
           from (values (10), (2), (3), (4), (4), (6), (7), (9), (12), (13)) v(n)),
     a as (select n, dense_rank() over (order by n) rn from t)
select top(1) rn from a where n > rn order by n;

rn1
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773723
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey odegovЗаменить на dense_rank:
Код: sql
1.
2.
3.
4.
with t as (select *
           from (values (1), (2), (3), (4), (4), (5), (7), (9), (12), (13)) v(n)),
     a as (select n, dense_rank() over (order by n) rn from t)
select top(1) rn from a where n > rn order by n;

rn6
главное что бы в "набор случайных чисел" не попал 0, ну и сразу чтобы 2 раза не вставать отрицательные числа ещё
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773725
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вижу, ТЗ меняется на ходу :)
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773726
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey odegovЯ вижу, ТЗ меняется на ходу :)
ой всё?
авторЕсть таблица с номерами Таблица(int Number)

Она содержит набор случайных чисел,
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773728
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot TaPaK]andrey odegovЯ вижу, ТЗ меняется на ходу :)
ой всё?
авторЕсть таблица с номерами Таблица(int Number)

Она содержит набор случайных чисел,автор, скажем 1,2,3,4,5,7,9,12,13... Я не вижу чисел меньше 1.
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773729
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot andrey odegov]TaPaKпропущено...

ой всё?
пропущено...
пропущено...
Я не вижу чисел меньше 1.
пффф, действительно, решение простое

Код: sql
1.
SELECT 6
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773795
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey odegovПроверим?
Возьмем 10 000 000 миллионов строк, сделаем дыру в районе 4 000 000 миллионов.
Выполняем здесь https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=37d75a987970762218a55792eadc5ca3.
План здесь https://www.brentozar.com/pastetheplan/?id=Skf1w_zrE.
ну скан-же в плане
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773802
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypну скан-же в планеИ?
По-вашему это означает, что таблица будет гарантированно полностью прочитана?
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773805
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmLessypну скан-же в планеИ?
По-вашему это означает, что таблица будет гарантированно полностью прочитана?
зависит где дырка будет найдена, в данном плане считалось 4 миллиона в память
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773817
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessyp,

Хотите сразу знать где "дырка" - ведите их учет в отдельной таблице.
...
Рейтинг: 0 / 0
Получить ближайшее число отсутствующее в последовательности
    #39773950
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with
  t as (
    select *
    from (
      values (-10), (-2), (-3), (-4), (-5), (1), (2), (3), (4), (4), (5), (7), (9), (12), (13)
    ) v(n)
  )
select top(1)
  n + 1
from t
order by n - dense_rank() over (order by n), n desc;
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить ближайшее число отсутствующее в последовательности
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]