Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Непрерывные периоды  [new]
Noisfux
Member

Откуда:
Сообщений: 2
Доброго времени.
Подскажите пожалуйста, есть такие данные
01.01.2018 - 31.01.18
01.02.2018 - 28.02.18
01.03.2018 - 31.03.18

(Даты могут пересекаться между собой)

Результат запроса:01.01.2018 - 31.03.18

Но если есть пробел:
01.01.2018 - 31.01.18
01.03.2018 - 31.03.18


То результат запроса должен быть: 01.03.2018 - 31.03.18

Заранее благодарен.
14 сен 18, 11:49    [21674539]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28403
http://www.sql.ru/forum/actualsearch.aspx?search=??????????? ??????????&sin=0&bid=3&a=&ma=0&dt=-1&s=1&so=1
14 сен 18, 11:52    [21674546]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
mibin
Member

Откуда:
Сообщений: 32
Noisfux,

WITH
  w_data AS
  (
    SELECT to_date('01.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('15.01.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
    SELECT to_date('15.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('31.01.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
    SELECT to_date('01.06.2018','dd.mm.yyyy') AS dt_beg,  to_date('30.06.2018','dd.mm.yyyy')  AS dt_end FROM dual
    
  )
SELECT MIN(dt_beg) AS dt_beg,
       MAX(dt_end) AS dt_end
  FROM (
          SELECT dt_beg,
                 dt_end,
                 SUM(is_flag) OVER (ORDER BY dt_beg) AS grp
            FROM (
                    SELECT dt_beg,
                           dt_end,
                           CASE WHEN lag(dt_end) OVER (ORDER BY dt_beg) = dt_beg THEN NULL ELSE 1 END AS is_flag
                      FROM w_data
                 )
       )
 GROUP BY grp
 ORDER BY 1,2
14 сен 18, 12:16    [21674587]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28403
mibin
WHEN lag(dt_end) OVER (ORDER BY dt_beg) = dt_beg
Noisfux
(Даты могут пересекаться между собой)
14 сен 18, 12:21    [21674597]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
mibin
Member

Откуда:
Сообщений: 32
Elic,

Согласен,
WITH
  w_data AS
  (
    SELECT to_date('01.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('15.01.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
    SELECT to_date('11.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('31.01.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
    SELECT to_date('20.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('06.05.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
    SELECT to_date('01.06.2018','dd.mm.yyyy') AS dt_beg,  to_date('30.06.2018','dd.mm.yyyy')  AS dt_end FROM dual
    
  )
SELECT MIN(dt_beg) AS dt_beg,
       MAX(dt_end) AS dt_end
  FROM (
          SELECT dt_beg,
                 dt_end,
                 SUM(is_flag) OVER (ORDER BY dt_beg) AS grp
            FROM (
                    SELECT dt_beg,
                           dt_end,
                           CASE WHEN lag(dt_end) OVER (ORDER BY dt_beg) >= dt_beg THEN NULL ELSE 1 END AS is_flag
                      FROM w_data
                 )
       )
 GROUP BY grp
 ORDER BY 1,2
14 сен 18, 12:43    [21674615]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28403
mibin
WHEN lag(dt_end) OVER (ORDER BY dt_beg) >= dt_beg
Наивный.
21667922
14 сен 18, 12:55    [21674623]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
mibin
Member

Откуда:
Сообщений: 32
Elic,

Я не волшебник, я только учусь, а с моим решение что не так? На каких данных оно ломается?
14 сен 18, 13:00    [21674631]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28403
mibin
а с моим решение что не так? На каких данных оно ломается?
Пересекаться можно не только с соседом...
14 сен 18, 13:07    [21674641]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1373
mibin
Elic,

Я не волшебник, я только учусь, а с моим решение что не так? На каких данных оно ломается?


насколько я понял надо последний "непрерывный" интервальчик

автор
То результат запроса должен быть: 01.03.2018 - 31.03.18


зи
что имеется под
автор
(Даты могут пересекаться между собой)


трудно судить
нужен более сложный пример данных и что получить

.....
stax
14 сен 18, 13:11    [21674648]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
mibin
Member

Откуда:
Сообщений: 32
Elic,

Не могу представить такой пример, в случае выстроения всех по дате начала.
Можно пример?
14 сен 18, 13:17    [21674657]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28403
mibin
Не могу представить такой пример, в случае выстроения всех по дате начала.
Можно пример?
Сутки, завтрак, обед
14 сен 18, 13:26    [21674665]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1373
mibin
Elic,

Не могу представить такой пример, в случае выстроения всех по дате начала.
Можно пример?

  1  WITH
  2    w_data AS
  3    (
  4      SELECT to_date('01.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('15.05.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
  5      SELECT to_date('11.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('31.01.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
  6      SELECT to_date('20.01.2018','dd.mm.yyyy') AS dt_beg,  to_date('21.01.2018','dd.mm.yyyy')  AS dt_end FROM dual UNION ALL
  7      SELECT to_date('14.05.2018','dd.mm.yyyy') AS dt_beg,  to_date('30.06.2018','dd.mm.yyyy')  AS dt_end FROM dual
  8    )
  9  SELECT MIN(dt_beg) AS dt_beg,
 10         MAX(dt_end) AS dt_end
 11    FROM (
 12            SELECT dt_beg,
 13                   dt_end,
 14                   SUM(is_flag) OVER (ORDER BY dt_beg) AS grp
 15              FROM (
 16                      SELECT dt_beg,
 17                             dt_end,
 18                             CASE WHEN lag(dt_end) OVER (ORDER BY dt_beg) >= dt_beg THEN NULL ELSE 1 END AS is_flag
 19                        FROM w_data
 20                   )
 21         )
 22   GROUP BY grp
 23*  ORDER BY 1,2
SQL> /

DT_BEG   DT_END
-------- --------
01.01.18 15.05.18
14.05.18 30.06.18


.....
stax
14 сен 18, 14:00    [21674732]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1373
Noisfux,

последний интервальчик (после обединения перекрывающихся)
  1  with t(d1,d2) as (
  2  select to_date('01.01.2018'),to_date('31.01.18') from dual union all
  3  select to_date('01.02.2018'),to_date('28.02.18') from dual union all
  4  select to_date('01.03.2018'),to_date('31.03.18') from dual union all
  5  select to_date('02.04.2018'),to_date('30.04.18') from dual union all
  6  select to_date('12.04.2018'),to_date('31.05.18') from dual union all
  7  select to_date('01.05.2018'),to_date('31.05.18') from dual union all
  8  select to_date('01.05.2018'),to_date('31.05.18') from dual union all
  9  select to_date('01.05.2018'),to_date('20.05.18') from dual union all
 10  select to_date('21.05.2018'),to_date('30.06.18') from dual union all
 11  select to_date('01.07.2018'),to_date('31.07.18') from dual
 12  )
 13  ,tt as (
 14     select
 15       decode(m,1,d1,d2+1) d
 16      ,m
 17      ,sum(m) over (order by decode(m,1,d1,d2+1) desc) l
 18     from t,(select 1 m from dual union all select -1 from dual) u)
 19  select
 20    max(decode(l, 0,d)) d_start
 21   ,max(decode(l,-1,d-1)) d_end
 22* from tt
SQL> /

D_START  D_END
-------- --------
02.04.18 31.07.18


.....
stax
14 сен 18, 15:12    [21674818]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Noisfux
Member

Откуда:
Сообщений: 2
Спасибо!
14 сен 18, 16:53    [21674933]     Ответить | Цитировать Сообщить модератору
 Re: Непрерывные периоды  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1373
Noisfux,

у меня ошибка
надо max(d-1) d_end

.....
stax
16 сен 18, 14:55    [21675962]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить