Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение дат в периоды / 9 сообщений из 9, страница 1 из 1
25.05.2020, 19:14
    #39961865
jurafenix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
Доброго времени суток, уважаемые форумчане!

Прошу вашей помощи, как малосведущему в SQL. Как можно из таблицы А сделать таблицу Б? Думал о рекурсивном запросе, о group by, но никак не могу придумать способа((

Заранее спасибо за помощь!

Таблица А
Id1 id2 Dt
a a 01.01.2020
a a 02.01.2020
a a 03.01.2020
a b 04.01.2020
a b 05.01.2020
a b 06.01.2020
a b 07.01.2020
a c 08.01.2020
a c 09.01.2020
a a 10.01.2020
a a 11.01.2020
a a 12.01.2020
b a 01.02.2020
b a 02.02.2020
b a 03.02.2020
b b 04.02.2020
b b 05.02.2020
b b 06.02.2020
b b 07.02.2020
b c 08.02.2020
b c 09.02.2020
b c 10.02.2020
b d 11.02.2020
b d 12.02.2020
b d 13.02.2020
b d 14.02.2020

Таблица Б
Id1 id2 dt_start dt_finish
a a 01.01.2020 03.01.2020
a b 04.01.2020 07.01.2020
a c 08.01.2020 09.01.2020
a a 10.01.2020 12.01.2020
b a 01.02.2020 03.02.2020
b b 04.02.2020 07.02.2020
b c 08.02.2020 10.02.2020
b d 11.02.2020 14.02.2020
...
Рейтинг: 0 / 0
25.05.2020, 19:52
    #39961872
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
jurafenix,

Таблица В выглядит как минимальная дата и максимальная дата для каждой комбинации из id1 и id2 из таблицы А - в этом случае предлагаю еще немного подумать о group by

Regards
...
Рейтинг: 0 / 0
25.05.2020, 20:15
    #39961876
jurafenix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
Maxim Demenko,
К сожалению, это неверно. Если посмотреть внимательнее, то комбинация a-a встречается дважды с разными диапазонами дат.
...
Рейтинг: 0 / 0
25.05.2020, 20:25
    #39961878
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
jurafenix,

И тем не менее - решается с помощью group by - ищите по форуму "start of group".

Regards
...
Рейтинг: 0 / 0
26.05.2020, 08:53
    #39962006
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
jurafenix,
Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t (id1,id2,dt) as(
  2  select 'a','       a',to_date('01.01.2020','dd.mm.yyyy') from dual union all
  3  select 'a','       a',to_date('02.01.2020','dd.mm.yyyy') from dual union all
  4  select 'a','       a',to_date('03.01.2020','dd.mm.yyyy') from dual union all
  5  select 'a','       b',to_date('04.01.2020','dd.mm.yyyy') from dual union all
  6  select 'a','       b',to_date('05.01.2020','dd.mm.yyyy') from dual union all
  7  select 'a','       b',to_date('06.01.2020','dd.mm.yyyy') from dual union all
  8  select 'a','       b',to_date('07.01.2020','dd.mm.yyyy') from dual union all
  9  select 'a','       c',to_date('08.01.2020','dd.mm.yyyy') from dual union all
 10  select 'a','       c',to_date('09.01.2020','dd.mm.yyyy') from dual union all
 11  select 'a','       a',to_date('10.01.2020','dd.mm.yyyy') from dual union all
 12  select 'a','       a',to_date('11.01.2020','dd.mm.yyyy') from dual union all
 13  select 'a','       a',to_date('12.01.2020','dd.mm.yyyy') from dual union all
 14  select 'b','       a',to_date('01.02.2020','dd.mm.yyyy') from dual union all
 15  select 'b','       a',to_date('02.02.2020','dd.mm.yyyy') from dual union all
 16  select 'b','       a',to_date('03.02.2020','dd.mm.yyyy') from dual
 17  )
 18  select id1,id2,min(dt) s,max(dt) f from (select * from t order by id1,id2,dt) tt
 19  group by id1,id2,dt-rownum
 20* order by 1,2,3
SQL> /

I ID S          F
- -- ---------- ----------
a       a 01.01.2020 03.01.2020
a       a 10.01.2020 12.01.2020
a       b 04.01.2020 07.01.2020
a       c 08.01.2020 09.01.2020
b       a 01.02.2020 03.02.2020

SQL>



.....
stax
...
Рейтинг: 0 / 0
27.05.2020, 20:45
    #39963062
jurafenix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
Stax, огромное спасибо! Именно Ваш совет помог мне разобраться как сделать. Правда на большом объеме данных пришлось еще row_number группировать, но решение простое и потрясное!
...
Рейтинг: 0 / 0
27.05.2020, 21:22
    #39963076
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
Stax,

Пора уже переходить на match_recognize:

Код: 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.
36.
37.
38.
39.
40.
41.
with t (id1,id2,dt)
  as(
     select 'a','a',to_date('01.01.2020','dd.mm.yyyy') from dual union all
     select 'a','a',to_date('02.01.2020','dd.mm.yyyy') from dual union all
     select 'a','a',to_date('03.01.2020','dd.mm.yyyy') from dual union all
     select 'a','b',to_date('04.01.2020','dd.mm.yyyy') from dual union all
     select 'a','b',to_date('05.01.2020','dd.mm.yyyy') from dual union all
     select 'a','b',to_date('06.01.2020','dd.mm.yyyy') from dual union all
     select 'a','b',to_date('07.01.2020','dd.mm.yyyy') from dual union all
     select 'a','c',to_date('08.01.2020','dd.mm.yyyy') from dual union all
     select 'a','c',to_date('09.01.2020','dd.mm.yyyy') from dual union all
     select 'a','a',to_date('10.01.2020','dd.mm.yyyy') from dual union all
     select 'a','a',to_date('11.01.2020','dd.mm.yyyy') from dual union all
     select 'a','a',to_date('12.01.2020','dd.mm.yyyy') from dual union all
     select 'b','a',to_date('01.02.2020','dd.mm.yyyy') from dual union all
     select 'b','a',to_date('02.02.2020','dd.mm.yyyy') from dual union all
     select 'b','a',to_date('03.02.2020','dd.mm.yyyy') from dual
    )
select  *
  from  t
  match_recognize(
                  partition by id1,
                               id2
                  order by dt
                  measures
                    first(dt) dt_start,
                    last(dt)  dt_finish
                  pattern(gap no_gap+)
                  define no_gap as dt = prev(dt) + 1
                 )
/

ID1 ID2 DT_START  DT_FINISH
--- --- --------- ---------
a   a   01-JAN-20 03-JAN-20
a   a   10-JAN-20 12-JAN-20
a   b   04-JAN-20 07-JAN-20
a   c   08-JAN-20 09-JAN-20
b   a   01-FEB-20 03-FEB-20

SQL>



SY.
...
Рейтинг: 0 / 0
28.05.2020, 08:51
    #39963168
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
SY
Stax,

Пора уже переходить на match_recognize:

SY.


мне не очень удобно из-за древней версии

зы
очепятка gap no_gap +

....
stax
...
Рейтинг: 0 / 0
28.05.2020, 14:00
    #39963348
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение дат в периоды
Stax

зы
очепятка gap no_gap +


Согласен. Должно быть

pattern(gap no_gap * )

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение дат в периоды / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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