Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Непрерывный диапазон (другой случай) / 10 сообщений из 10, страница 1 из 1
03.02.2021, 20:59
    #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
03.02.2021, 21:11
    #40041355
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный диапазон (другой случай)
ARRay001,

Сейчас придет Элик и скажет тебе - поищи про start_of_group
...
Рейтинг: 0 / 0
03.02.2021, 21:27
    #40041358
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный диапазон (другой случай)
oragraf,
интересная фишка - разбираюсь, но пока где-то рядом только...
...
Рейтинг: 0 / 0
03.02.2021, 21:40
    #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
03.02.2021, 21:52
    #40041368
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный диапазон (другой случай)
Maxim Demenko,
эта стандартная штука даст результат min и max только по уникальным num1, а надо ещё ориентироваться на непрерывные последовательности в num2
...
Рейтинг: 0 / 0
04.02.2021, 00:15
    #40041395
SY
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
04.02.2021, 00:33
    #40041397
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный диапазон (другой случай)
SY,
спасибо!
Но это только с 12-й версии как я понял.
А в 11-й (надо на эту версию) наверное надо всё-таки через алгоритм start_of_group...
...
Рейтинг: 0 / 0
04.02.2021, 11:25
    #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
07.02.2021, 09:21
    #40042758
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный диапазон (другой случай)
Stax,
Спасибо за решение - очень помогло!

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

Может ещё кто кинет ссылочку на описание этого (start_of_group) и подобных интересных алгоритмов (может есть такой ресурс)?
А то, кроме этого форума, нигде не встречал...
...
Рейтинг: 0 / 0
07.02.2021, 14:16
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Непрерывный диапазон (другой случай) / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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