powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Селект для выделения пропущенных последовательностей
7 сообщений из 7, страница 1 из 1
Селект для выделения пропущенных последовательностей
    #32108824
epidemic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица FILES с полями (SRC, SEQ), где SRC - какое-то имя, а SEQ - это номер файла, который поступил от SRC. Для каждого из SRC создается в таблице FILES запись, в которой указывается номер пришедшего от него файла. Номера должны быть последовательными. Как написать запрос, который выводил бы номера SEQ (их диапазон!) для данного SRC, которые были пропущены?

Следующий запрос выводит лишь номера последовательностей, с которых начинается диапазон пропущенных файлов (но не сам диапазон):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
    seq+ 1 
from
    files as f
where
    src = :src_name
    and not exists
    (
        select
             1 
        from
            files
        where
            src = :src_name
        and seq = f.seq+ 1 
    )
order by  1 
...
Рейтинг: 0 / 0
Селект для выделения пропущенных последовательностей
    #32108830
Знаток №1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я не понял что ты конкретно хочешь
...
Рейтинг: 0 / 0
Селект для выделения пропущенных последовательностей
    #32108865
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы каким-либо образом получил recordset из всем чисел между min(seq)..max(seq), после чего сравнивал бы его с FILES. Внешним соединением, not exist или еще как. Это для вывода всего диапазона. А для вывода границ диапазона дырок смотри LAG/LEAD Functions:

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96520/analysis.htm#15913

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
create table test (
    test_id number( 9 )
  , constraint pk_test primary key (test_id)
)
/
insert into test (test_id)
  select rownum from all_objects where rownum <=  40 
/
delete test
where test_id between  4  and  7 
   or test_id between  10  and  15 
   or test_id between  20  and  25 
/
commit;

select t.*
     , case 
         when t.lead_test_id > t.test_id +  1  
          and t.lag_test_id = t.test_id -  1  
         then test_id +  1  
       end begin_hole
     , case 
         when t.lag_test_id < t.test_id -  1  
          and t.lead_test_id = t.test_id +  1  
         then test_id -  1  
       end end_hole
from (
  select t.test_id
       , lag(t.test_id) over (order by test_id) lag_test_id
       , lead(t.test_id) over (order by test_id) lead_test_id
  from test t
) t
/
...
Рейтинг: 0 / 0
Селект для выделения пропущенных последовательностей
    #32108875
epidemic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример Дениса очень интересный! Спасибо, постараюсь разобраться.
...
Рейтинг: 0 / 0
Селект для выделения пропущенных последовательностей
    #32109060
gminter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем виде, извратиться можно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select (t1.id +  1 ) as from_val,
(select (t2.id -  1 ) from MY_TABLE t2
     where t2.id -  1  not in (select max(ttt.id) from MY_TABLE ttt )
     and rownum =  1  and t2.id >= t1.id +  1  ) as  to_val
from MY_TABLE t1
where t1.id not in (select (tt.id -  1 ) from MY_TABLE tt) 

order by from_val

Получишь диапазоны дырок )
...
Рейтинг: 0 / 0
Селект для выделения пропущенных последовательностей
    #32109301
epidemic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, тоже весьма оригинально ) Хоть и запутанно )) Но зато без использования незнакомых мне case, lag и lead )

Эти самые case, lag и lead - они только для Oracle или являются стандартом SQL?
...
Рейтинг: 0 / 0
Селект для выделения пропущенных последовательностей
    #32109317
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LAG & LEAD - только оракловые функции, появились в Oracle 8.1.6:

http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/preface.htm#968873

Выражение CASE входит в стандарт ANSI SQL 92 (SQL-2)., но в Oracle появилось опять же начиная с версии 8.1.6, смотри по этой же ссылке чуть ниже.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Селект для выделения пропущенных последовательностей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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