Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 пропуски в последовательности чисел  [new]
radio_t
Member

Откуда:
Сообщений: 21
То ли тяпница, то ли пиво, то ли я тупое - не могу сообразить.
Есть последовательность чисел, увеличивающихся на единицу (38, 39, 40, 41, 42). Периодически эта последовательность сбрасывается в 1. Условия сброса - достижение 100, 1000, 10000 (один сброс может быть на 1000, следующий на 100 и т.п.), т.е. числа 96,97,98,99,1,2,3 - последовательно следуют друг за другом.

Как проще всего обнаружить - нет ли в последовательности из 20-40 таких чисел "дырок" (не пропущено ли одно число или более)?

P.S. В поиске не отыскал.
12 сен 08, 16:57    [6180013]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
radio_t

P.S. В поиске не отыскал.

а мне повезло ;)
12 сен 08, 17:02    [6180056]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
radio_t
Member

Откуда:
Сообщений: 21
pravednik
а мне повезло ;)
Есть разница - там чистая последовательность, здесь сбрасывание в 1 по динамическому верхнему порогу. Если воспользоваться тем алгоритмом, то у меня на последовательности 96,97,98,99,1,2,3 будет "дырка" от 4 до 95 включительно, хотя, как я уже написал, по условию эти числа идут друг за другом.
12 сен 08, 17:07    [6180072]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Elic
Member

Откуда:
Сообщений: 29979
case when (lag(n) over (order by <порядок!>), n) not in ((n-1, n), (99, 1), (999, 1), (9999, 1)) then 'Y' end as previous_absent_flag
12 сен 08, 17:27    [6180171]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
radio_t

Как проще всего обнаружить - нет ли в последовательности из 20-40 таких

SQL> select s, case when
  2               count(distinct mod(100+val-rn,100)+trunc((100+val-rn)/100)) = 1
  3               or count(distinct mod(1000+val-rn,1000)+trunc((1000+val-rn)/1000)) = 1
  4               or count(distinct mod(10000+val-rn,10000)+trunc((10000+val-rn)/10000)) = 1
  5             then 'нет'
  6             else 'есть'
  7            end "Нарушений последовательности"
  8  from (
  9  select s,to_number(regexp_substr(s, '\d+', 1, level)) val , level rn
 10  from (select '96,97,98,99,1,2,3' s from dual
 11        union all select '996,997,998,999,1,2,3' s from dual
 12        union all select '9996,9997,9998,9999,1,2,3' s from dual
 13        union all select '1,2,3,5' s from dual
 14        union all select '9996,9997,9998,9999,2,3' s from dual
 15       )
 16  connect by regexp_substr(s, '\d+', 1, level) is not null
 17          and prior s = s
 18          and prior dbms_random.value is not null
 19          )
 20  group by s
 21  ;
 
S                         Нарушений последовательности
------------------------- ----------------------------
1,2,3,5                   есть
96,97,98,99,1,2,3         нет
996,997,998,999,1,2,3     нет
9996,9997,9998,9999,1,2,3 нет
9996,9997,9998,9999,2,3   есть
должно, по идее, работатЬ, при условии что длина диапазона < 100 значений
12 сен 08, 18:12    [6180418]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Elic
Member

Откуда:
Сообщений: 29979
Zloxa
  6             else 'есть'
А если следющий вопрос будет "какие?" :)
12 сен 08, 18:20    [6180448]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Заятс
Member

Откуда: Киев
Сообщений: 316
Всё проще: если был сброс, значит есть 1. Единственная последовательность без сброса, содержащая единицу - 1,2,3,...,N -её исключаем. Т.е.
Select 'Сброс присутствует'
   FROM
     (Select Min(n) as minval, Max(n) as maxval, Count(n) as n_cnt From T)
   WHERE minval = 1 And maxval > n_cnt;
12 сен 08, 18:23    [6180452]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Elic
Member

Откуда:
Сообщений: 29979
Заятс
Всё проще:
Select 'Сброс присутствует'
Ищется не сброс, а пропуски
12 сен 08, 18:26    [6180462]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Заятс
Member

Откуда: Киев
Сообщений: 316
radio_t
Периодически эта последовательность сбрасывается в 1.
Вот ключевое условие!!!
А
radio_t
Как проще всего обнаружить - нет ли в последовательности из 20-40 таких чисел "дырок" (не пропущено ли одно число или более)?
совсем другое условие.
Автор, так решение какой задачи тебя интересует? Если второй, то сформулируй её более чётко.
12 сен 08, 18:36    [6180487]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
Заятс
сформулируй её более чётко

Куда уж более точно.

Для тех кто в танке.
Дано:
radio_t
Есть последовательность чисел, увеличивающихся на единицу (38, 39, 40, 41, 42). Периодически эта последовательность сбрасывается в 1. Условия сброса - достижение 100, 1000, 10000 (один сброс может быть на 1000, следующий на 100 и т.п.), т.е. числа 96,97,98,99,1,2,3 - последовательно следуют друг за другом.


Найти:
radio_t
Как проще всего обнаружить - нет ли в последовательности из 20-40 таких чисел "дырок" (не пропущено ли одно число или более)?
12 сен 08, 18:42    [6180512]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
radio_t
Member

Откуда:
Сообщений: 21
Zloxa, у мну упорно выходит ORA-01436: CONNECT BY loop in user data.
Andrey.L, спасибо, все правильно )
15 сен 08, 09:16    [6183796]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
radio_t
Member

Откуда:
Сообщений: 21
Пока сделал так - привел к обычной последовательности без сброса и применил известные методы поиска дырок в оной. Решение не универсально, имхо можно и лучше.
SQL> /*допустим максимальное количество чисел в последовательности=50*/
  2  select cc
  3         +
  4         case when /*был сброс, значит минимум =1 и максимум точно >98, т.к. в последовательности у нас всего 50 чисел*/
  5                (min(cc) over ())=1 and (max(cc) over ())>98
  6                and /*ЕСЛИ число<51*/
  7                cc<51
  8              then (max(cc) over ()) /*ТО добавим к нему максимальное число в последовательности(был сброс значит это 99,999,9999)*/
  9              else 0
 10              end сcc
 11  from
 12  (
 13  select 97 as cc from dual union all
 14  select 98 from dual union all
 15  select 99 from dual union all
 16  select 1 from dual union all
 17  select 2 from dual union all
 18  select 3 from dual union all
 19  select 4 from dual
 20  )
 21  /

       СCC
----------
        97
        98
        99
       100
       101
       102
       103

7 rows selected

SQL> 
15 сен 08, 09:50    [6183901]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
stax..
Guest
вопрос из танка
есть ли разрывы
1
2
3
4
5
6
7
8
9
997
998
999
98
99
1
2
3
4
если есть
1) смотрим на предытущий должен быть -1 или если текущий 1 то девятки
2)тупо строить "непрерывные" диапазоны
и если диапазон начинается не с 1 или заканчивается не на девятки то разрыв
.....
stax
15 сен 08, 10:15    [6183987]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
radio_t
Пока сделал так

А если пропущено значение 99 или 1?
Чем не устроило решние Elic'а?
SQL> select
  2    cc
  3    ,case when (lag(cc) over (order by rn), cc) not in ((cc-1, cc), (99, 1), (999, 1), (9999, 1))
  4          then 'Y'
  5     end as previous_absent_flag
  6  from (
  7    select 1 RN, 97 as cc from dual union all
  8    --select 2 RN, 98 from dual union all
  9    select 3 RN, 99 from dual union all
 10    select 4 RN, 1 from dual union all
 11    select 5 RN, 2 from dual union all
 12    select 6 RN, 3 from dual union all
 13    select 7 RN, 4 from dual
 14  )
 15  ;
 
        CC PREVIOUS_ABSENT_FLAG
---------- --------------------
        97 
        99 Y
         1 
         2 
         3 
         4 
 
6 rows selected
 
15 сен 08, 10:20    [6184004]     Ответить | Цитировать Сообщить модератору
 Re: пропуски в последовательности чисел  [new]
radio_t
Member

Откуда:
Сообщений: 21
устроило ) проскипал )
15 сен 08, 16:16    [6186475]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить