Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбить период на подпериоды. / 10 сообщений из 10, страница 1 из 1
22.03.2018, 14:55
    #39618933
vi85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
Есть необходимость разбивки периода на несколько периодов. Например,
период 01.03.2018 - 10.03.2018
и два (их может быть больше) периода:
03.03.2018 - 05.03.2018,
07.03.2018 - 08.03.2018
В результате нужно получить периоды в которые не входят выше указанные периоды,т.е. результат должен быть :
01.03.2018 - 02.03.2018, 06.03.2018 - 06.03.2018, 09.03.2018 - 10.03.2018

Ситуации могут быть когда даты первого периода находятся внутри последующих периодов, например
01.03.2018 - 10.03.2018
и 03.02.2018 - 12.03.2018 , в таком случае запрос не должен выдавать резулльтат.

01.03.2018 - 10.03.2018 и 25.02.2018 - 03.03.2018 в результате будет 04.03.2018- 10.03.2018
01.03.2018 - 10.03.2018 и 05.03.2018 - 13.03.2018 в результате будет 11.03.2018- 13.03.2018
и тд

Может кто сталкивался с такой задачей , возможно ли запросом решиь данную задачу?
Заранее благодарю за ответы.
...
Рейтинг: 0 / 0
22.03.2018, 15:05
    #39618946
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
vi85,

например:
1. берешь таблицу всех дат по первому периоду
2. исключаешь даты последующих периодов
3. остаток группируешь по sog
...
Рейтинг: 0 / 0
22.03.2018, 15:12
    #39618967
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
vi85,

вечная тема, пересекающиеся интервалы

если делать влоб

1) соеденяем каждый с кажным (получаем подинтервальчики)
2) выбрасываем дубли


ps
лень тестовые данные набивать

.....
stax
...
Рейтинг: 0 / 0
22.03.2018, 15:21
    #39618975
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
vi85,

тю, ето ж проще
исходный ж перид один одиношенький

гляньте с другой стороны
"разбить/обьеденить" несколько периодов одним

....
stax
...
Рейтинг: 0 / 0
23.03.2018, 08:07
    #39619220
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
Stax,

А можно пример?
Развернуть все интервалы в строки, затем убрать пересекающиеся - это довольно просто.
А как потом строки собрать обратно в период?
Например:
01.01.2018
02.01.2018
03.01.2018
07.01.2018
08.01.2018
Как привести к виду:
01.01.2018 - 03.01.2018
07.01.2018 - 08.01.2018
?
...
Рейтинг: 0 / 0
23.03.2018, 09:01
    #39619254
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
Dshedoo,

SOG 21277815
...
Рейтинг: 0 / 0
23.03.2018, 09:26
    #39619278
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
EgoрDshedoo,

SOG 21277815
Действительно.
Ещё нашёл такую интересную штуку:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select min (beg_date) as beg_date,
       max (end_date) as end_date
from (
      select beg_date,
             end_date,
             sum(strt_grp) over (order by beg_date, end_date ) grp_num
      from (
             select  beg_date,
                     end_date,
                     case when beg_date > 1 + max(end_date) over (order by beg_date, end_date rows between unbounded preceding and 1 preceding) then 1 end strt_grp
             from table
           )
     )
group by grp_num
order by beg_date;
...
Рейтинг: 0 / 0
23.03.2018, 09:34
    #39619284
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
Dshedoo,

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

  1  with t as (
  2  select to_date('01.01.2018','dd.mm.yyyy') d from dual union all
  3  select to_date('02.01.2018','dd.mm.yyyy') d from dual union all
  4  select to_date('03.01.2018','dd.mm.yyyy') d from dual union all
  5  select to_date('07.01.2018','dd.mm.yyyy') d from dual union all
  6  select to_date('08.01.2018','dd.mm.yyyy') d from dual
  7  )
  8  , tt as (
  9  select
 10    d
 11   ,d-row_number() over (order by d) gr
 12  from t)
 13  select min(d) b,max(d) e
 14  from tt
 15  group by gr
 16* order by 1
 17  /

B        E
-------- --------
01.01.18 03.01.18
07.01.18 08.01.18



зы
если появится время, попробую без разворачивания в дни

....
stax
...
Рейтинг: 0 / 0
23.03.2018, 10:36
    #39619323
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
Dshedoo,

сильно не тестировал
Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
SQL> ed
Wrote file afiedt.buf

  1  with t1 as (
  2  select date '2018-03-01' sstart,date '2018-03-31' stop from dual )
  3  ,t2 as (
  4  select date '2018-03-05' b,date '2018-03-10' e from dual union all
  5  select date '2018-03-07' b,date '2018-03-13' e from dual union all
  6  select date '2018-03-15' b,date '2018-03-17' e from dual union all
  7  select date '2018-03-17' b,date '2018-03-20' e from dual union all
  8  select date '2018-03-27' b,date '2018-03-29' e from dual
  9  --select date '2018-03-01' b,date '2018-03-31' e from dual
 10  )
 11  ,d2 as (
 12  --для юнион алл
 13  select  1 n from dual union all
 14  select -1 n from dual)
 15  ,t as (
 16  --выбрасываем лишнее (не пересекающиеся)
 17    select case when b<=sstart then sstart-1 else b end b
 18          ,case when e>=stop   then stop+1   else e end e
 19    from t2,t1
 20    where b<=stop and e>=sstart
 21    union all
 22  --добавляем главный диапазон
 23    select sstart-1,stop+1 from t1)
 24  ,tt as (
 25  --в столбик
 26    select decode (n,1,b,e) d,n,sum(n) over (order by decode (n,1,b,e)) s from t,d2)
 27  ,ttt as (
 28  -- оратно в диапазоны
 29    select
 30     d b
 31    ,lead(d) over (order by d,s desc) e
 32    ,s s1
 33    ,lead(s) over (order by d,s desc) s2
 34    from tt
 35  )
 36  select
 37  --вывод не "пересекающихся"
 38   b+1 b,e-1 e
 39  -- *
 40  from ttt
 41  where s1=1
 42* order by 1
SQL> /

B        E
-------- --------
01.03.18 04.03.18
14.03.18 14.03.18
21.03.18 26.03.18
30.03.18 31.03.18

SQL>



.....
stax
...
Рейтинг: 0 / 0
23.03.2018, 11:12
    #39619343
vi85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить период на подпериоды.
Stax, огромное спасибо.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбить период на подпериоды. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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