powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Непрерывный диапазон (другой случай)
10 сообщений из 10, страница 1 из 1
Непрерывный диапазон (другой случай)
    #40041353
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть задачка на непрерывный диапазон:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t1 as (select 1 num1, 5 num2 from dual union all
            select 1     , 6      from dual union all
            select 2     , 22     from dual union all
            select 2     , 23     from dual union all
            select 2     , 24     from dual union all
            select 2     , 25     from dual union all
            select 5     , 29     from dual union all
            select 6     , 30     from dual union all
            select 6     , 31     from dual
            )
select * 
from   t1;  



Надо вывести в таком виде:
Код: plsql
1.
2.
3.
4.
5.
num1          num2beg        num2end 
1                5              6
2                22            25  
5                29            29
6                30            31


Предполагаю что как-то с keep(dense_rank last...) или lead, но конечное решение ещё не созрело.
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40041355
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

Сейчас придет Элик и скажет тебе - поищи про start_of_group
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40041358
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oragraf,
интересная фишка - разбираюсь, но пока где-то рядом только...
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40041362
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,
Из приведенного примера непонятно чем не устраивает элементарная ?
группировка
Код: plsql
1.
2.
3.
4.
select num1, min(num2) num2beg, max(num2)  num2end
from   t1
group by num1
order by num1



Regards

Maxim
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40041368
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Demenko,
эта стандартная штука даст результат min и max только по уникальным num1, а надо ещё ориентироваться на непрерывные последовательности в num2
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40041395
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
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.
34.
with t1 as (select 1 num1, 5 num2 from dual union all
            select 1     , 6      from dual union all
            select 2     , 22     from dual union all
            select 2     , 23     from dual union all
            select 2     , 24     from dual union all
            select 2     , 25     from dual union all
            select 5     , 29     from dual union all
            select 6     , 30     from dual union all
            select 6     , 31     from dual
            )
select  num1,
        num2beg,
        num2end
  from  t1
  match_recognize(
                  partition by num1
                  order by num2
                  measures
                    first(num2) num2beg,
                    last(num2)  num2end
                  one row per match
                  pattern(strt nogap*)
                  define nogap as num2 = prev(num2) + 1
                 )
/

      NUM1    NUM2BEG    NUM2END
---------- ---------- ----------
         1          5          6
         2         22         25
         5         29         29
         6         30         31

SQL>



SY.
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40041397
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
спасибо!
Но это только с 12-й версии как я понял.
А в 11-й (надо на эту версию) наверное надо всё-таки через алгоритм start_of_group...
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40041484
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

по старинке

Код: plsql
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.
34.
35.
SQL> ed
Wrote file afiedt.buf

  1  with t1 as (select 1 num1, 5 num2 from dual union all
  2              select 1     , 6      from dual union all
  3              select 2     , 12     from dual union all
  4              select 2     , 13     from dual union all
  5              select 2     , 22     from dual union all
  6              select 2     , 23     from dual union all
  7              select 2     , 24     from dual union all
  8              select 2     , 25     from dual union all
  9              select 5     , 29     from dual union all
 10              select 6     , 30     from dual union all
 11              select 6     , 34     from dual
 12              )
 13  , tt as (select t1.* ,row_number() over (partition by num1 order by num2) rn from   t1)
 14  select
 15    num1,min(num2) n1,max(num2) n2
 16  from tt
 17  group by num1,num2-rn
 18* order by 1,2
SQL> /

      NUM1         N1         N2
---------- ---------- ----------
         1          5          6
         2         12         13
         2         22         25
         5         29         29
         6         30         30
         6         34         34

6 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40042758
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Спасибо за решение - очень помогло!

Если бы ещё понять как это group by num2-rn - представить трудно.

Может ещё кто кинет ссылочку на описание этого (start_of_group) и подобных интересных алгоритмов (может есть такой ресурс)?
А то, кроме этого форума, нигде не встречал...
...
Рейтинг: 0 / 0
Непрерывный диапазон (другой случай)
    #40042800
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ARRay001

Если бы ещё понять как это group by num2-rn - представить трудно.

Да, изящно.

row_number() over (partition by num1 order by num2) rn

num1 = 2
(num2 - rn):
12 - 1 = 11 -> группа 1
13 - 2 = 11 -> группа 1
22 - 3 = 19 -> группа 2
23 - 4 = 19 -> группа 2
24 - 5 = 19 -> группа 2
25 - 6 = 19 -> группа 2
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Непрерывный диапазон (другой случай)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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