powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объединение дат в периоды
9 сообщений из 9, страница 1 из 1
Объединение дат в периоды
    #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
Объединение дат в периоды
    #39961872
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jurafenix,

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

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

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

Regards
...
Рейтинг: 0 / 0
Объединение дат в периоды
    #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
Объединение дат в периоды
    #39963062
jurafenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, огромное спасибо! Именно Ваш совет помог мне разобраться как сделать. Правда на большом объеме данных пришлось еще row_number группировать, но решение простое и потрясное!
...
Рейтинг: 0 / 0
Объединение дат в периоды
    #39963076
Фотография 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
Объединение дат в периоды
    #39963168
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Stax,

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

SY.


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

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

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

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


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

pattern(gap no_gap * )

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


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