Как нарушить последовательность - PullRequest
0 голосов
/ 05 марта 2020

у меня есть таблица с именем sequence с одним столбцом val и таблица выглядит так:

val
-----
1
2
3
5
8
9
10

мне нужно определить диапазон чисел, если есть разрыв последовательности и вывод как

range_start    range_end
-----------    ----------
1              3
5              5
8              10

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Вычтите возрастающую последовательность, и вы получите константу для значений в последовательности. Тогда совокупность:

select min(val), max(val)
from (select val, row_number() over (order by val) as seqnum
      from t
     ) t
group by (val - seqnum);
0 голосов
/ 05 марта 2020

Вы можете использовать функцию LAG(), чтобы назначить группу по номеру для каждого значения. Тогда группировка будет простой.

Например:

with
a as (
  select val,
    case when lag(val) over(order by val) = val - 1 then 0 else 1 end as adjacent
  from sequence
),
b as (
  select val,
  sum(adjacent) over(order by val) as grp
  from a
)
select min(val) as range_start, max(val) as range_end 
from b 
group by grp

Результат:

RANGE_START  RANGE_END
-----------  ---------
1            3        
5            5        
8            10       

Для справки, я использовал скрипт данных:

create table sequence (val number(6));

insert into sequence (val) values (1);
insert into sequence (val) values (2);
insert into sequence (val) values (3);
insert into sequence (val) values (5);
insert into sequence (val) values (8);
insert into sequence (val) values (9);
insert into sequence (val) values (10);

Дополнительное примечание : sequence - это действительно плохое имя для таблицы. Некоторые инструменты могут запутаться этим. Иногда вам придется заключать его в двойные кавычки по всему месту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...