Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Селект для выделения пропущенных последовательностей / 7 сообщений из 7, страница 1 из 1
19.02.2003, 15:06
    #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
19.02.2003, 15:12
    #32108830
Знаток №1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Селект для выделения пропущенных последовательностей
Так я не понял что ты конкретно хочешь
...
Рейтинг: 0 / 0
19.02.2003, 15:47
    #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
19.02.2003, 15:56
    #32108875
epidemic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Селект для выделения пропущенных последовательностей
Пример Дениса очень интересный! Спасибо, постараюсь разобраться.
...
Рейтинг: 0 / 0
19.02.2003, 21:07
    #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
20.02.2003, 11:27
    #32109301
epidemic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Селект для выделения пропущенных последовательностей
Кстати, тоже весьма оригинально ) Хоть и запутанно )) Но зато без использования незнакомых мне case, lag и lead )

Эти самые case, lag и lead - они только для Oracle или являются стандартом SQL?
...
Рейтинг: 0 / 0
20.02.2003, 11:47
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Селект для выделения пропущенных последовательностей / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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