powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Поиск пропущенных номеров
25 сообщений из 25, страница 1 из 1
Поиск пропущенных номеров
    #39277967
Proximator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Граждане, помогите создать запрос для FB 1.5 для поиска пропущенных номеров.
Таблица u1_case столбец u1_case.short_number. В поиске должны участвовать только те строки, где столбец u1_case.year_reg=2016.
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39277976
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мало того, что постановка задачи малоинформативна, дак еще и цена вопроса не указана!
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39277998
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Proximator,

пиши хранимую процедуру внутри которой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
prev_number = null;
FOR SELECT u1_case.short_number
      FROM u1_case
      WHERE u1_case.year_reg=2016
      ORDER BY u1_case.short_number
      INTO :anumber
DO BEGIN
  WHILE (anumber - prev_number > 1) DO
  BEGIN
     prev_number = prev_number  + 1;
     SUSPEND;
  END
  prev_number  = anumber;
END
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278006
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нафскидку, ты не сможешь выбрать селектом значения, которых в таблице нет.
поэтому придется заполнить другую (можно временную) таблицу всеми значениями номеров от мин до макс, далее -
select номер from полная_таблица left join таблица_с_пропусками
on полная_таблица.номер = таблица_с_пропусками.номер
where таблица_с_пропусками.номер is null

и пусть гуру меня поправят )
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278019
Proximator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
примеры запросов есть по указанным ниже ссылкам, но не получается переделать для FB.

https://habrahabr.ru/post/228099/
https://habrahabr.ru/post/303364/
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278030
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Proximator,

1. У тебя древняя версия firebird
2. Я же тебе сказал как это можно сделать в 1.5
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278031
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Proximator, что-то типа
Код: sql
1.
2.
3.
select num+1
from table t1
where not exists (select num from table t2 where t2.num=t1.num+1)

+проверка на граничные значения
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278051
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57,

я когда-то подобным образом извращался для обсчёта MLM в ещё 5-м интербейзе

скорость будет..... хреновой. NOT EXISTS почти наверняка даст NATURAL SCAN с игнором всех индексов

в общем вариант с хранимкой пока самый вменяемый
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278055
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochскорость будет..... хреновой. NOT EXISTS почти наверняка даст NATURAL SCAN с игнором всех индексов

в общем вариант с хранимкой пока самый вменяемыйНу это то понятно. Но мы не знаем конкретных условий и хотелок ТС'а. А по сему - привел самый тупой вариант. А вдруг его хватит?!
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278116
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochскорость будет..... хреновой. NOT EXISTS почти наверняка даст NATURAL SCAN с игнором всех индексов
NOT EXISTS легко заменяется LEFT JOIN
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278120
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ты специально ему написал?
Симонов Денис
Код: sql
1.
2.
prev_number = null;
...  WHILE (anumber - prev_number > 1) DO
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278125
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тема обсуждалась неоднократно.
искать па ключевым словам "поиск дырок".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278139
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

почти, не проверял и не особо думал. Ну воткнёт 0 и всё заработает, причём за один проход таблицы без дополнительных времянок.

Зато засада нормальная получилась. То ли ТС не догадался в чём дело, то ли даже не пробовал.
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278160
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Как ни странно, но именно по ключевым полям "дырок" и "пропущенных" находится только одна тема.
Там дана процедура для вывода дырок, а также запрос для вывода диапазонов пропущенных.

Добавлю-ка ещё и запрос, до кучи.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select R.RDB$RELATION_ID + R1.RDB$RELATION_ID * 10 + R2.RDB$RELATION_ID * 100
from RDB$RELATIONS R
    join RDB$RELATIONS R1 on R1.RDB$RELATION_ID < 10
    join RDB$RELATIONS R2 on R2.RDB$RELATION_ID < 10
    -- сюда дописать столько join, чтобы 10^ покрывало нужный максимум
    left join u1_case on u1_case.short_number = R.RDB$RELATION_ID + R1.RDB$RELATION_ID * 10 + R2.RDB$RELATION_ID * 100
where R.RDB$RELATION_ID < 10
    and (select coalesce(max(short_number), 0) from u1_case) > R.RDB$RELATION_ID + R1.RDB$RELATION_ID * 10 + R2.RDB$RELATION_ID * 100
    and u1_case.short_number is null
order by 1
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278201
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryAriochскорость будет..... хреновой. NOT EXISTS почти наверняка даст NATURAL SCAN с игнором всех индексов
NOT EXISTS легко заменяется LEFT JOIN

тоже верно

предполагая уникальность номеров, конечно

Код: sql
1.
2.
3.
4.
5.
6.
  select t1.short_number
    from tableName t1
    left join tableName t2 on t1.short_number = t2.short_number + 1 
  where ( t1.short_number > 1)
     and ( t2.short_number IS NULL )
  order by 1
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278202
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вернее так

Код: sql
1.
2.
3.
4.
5.
6.
7.
  select t1.short_number
    from u1_case t1
    left join u1_case t2 on t1.short_number = t2.short_number + 1 and t2.u1_case.year_reg=2016
  where ( t1.short_number > 1)
     and ( t2.short_number IS NULL )
     and ( t1.u1_case.year_reg=2016 )
  order by 1
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278209
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это если пробелы всегда шириной в один номер...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278212
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...а если пропуск в два, три номера, то что ?
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278214
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или речь о том, что выводятся только нижние границы (начала) пропусков, а не полностью все пропущенные номера ?

чтобы все пронумеровать - там точно надо SP писать
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278215
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для Firebird 3.0

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
set term ^;

recreate procedure sp_gen_series(astart int, aend int)
returns (avalue int)
as
begin
  avalue = astart;
  while (aend - avalue >= 0) do
  begin
    suspend;
    avalue = avalue + 1;
  end
end^

set term ;^

with t as (
  select
    coalesce(lag(id) over(order by id), 0) as prev_id,
    id
  from mytable)
select sp.avalue as id
from t join sp_gen_series(t.prev_id + 1, t.id - 1) sp on true
where t.id - t.prev_id > 1;
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278217
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochили речь о том, что выводятся только нижние границы (начала) пропусков, а не полностью все
пропущенные номера ?

Ага. ТС же так и не сказал назачем ему эти номера нужны. А то вдруг у него задача всего
лишь посчитать недостающие документы?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278267
Proximator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Именно так. Задача найти пропущенные номера, которые идут по порядку. Иногда при регистрации могут пропустить.
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278272
Proximator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery,
этот запрос вернул три значения, которые вообще не встречались в таблице и без учета года регистрации. Номер 0, который документам никогда не присваивается, а также пару максимальных значений, до которых очередь не дошла.
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278487
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Proximator,

"... Так вы и есть их за меня будете?" (ц)

Запрос писал для общей проверки. Для частных случаев, разумеется, дорабатывать напильником.
В твоём случае добавить AND u1_case.year_reg=2016 в условие соединения и в условие для нахождения максимума мог бы сам догадаться.
...
Рейтинг: 0 / 0
Поиск пропущенных номеров
    #39278523
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovвсего лишь посчитать недостающие документы?..


посчитать (а не перечислить) делается еще проще

select Max(id) - 1 /* или другой min id за период */ - count(*) from ... where ...
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Поиск пропущенных номеров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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