powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Непрерывные периоды
15 сообщений из 15, страница 1 из 1
Непрерывные периоды
    #39702537
Noisfux
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени.
Подскажите пожалуйста, есть такие данные
01.01.2018 - 31.01.1801.02.2018 - 28.02.1801.03.2018 - 31.03.18
(Даты могут пересекаться между собой)

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

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

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

Заранее благодарен.
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702544
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702572
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Noisfux,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702579
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibin
Код: plsql
1.
WHEN lag(dt_end) OVER (ORDER BY dt_beg) = dt_beg

Noisfux(Даты могут пересекаться между собой)
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702589
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Согласен,
Код: 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.
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
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702595
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibin
Код: plsql
1.
WHEN lag(dt_end) OVER (ORDER BY dt_beg) >= dt_beg

Наивный.
21667922
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702598
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Я не волшебник, я только учусь, а с моим решение что не так? На каких данных оно ломается?
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702605
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibinа с моим решение что не так? На каких данных оно ломается?Пересекаться можно не только с соседом...
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702610
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibinElic,

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

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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702616
mibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Не могу представить такой пример, в случае выстроения всех по дате начала.
Можно пример?
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702622
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibinНе могу представить такой пример, в случае выстроения всех по дате начала.
Можно пример?Сутки, завтрак, обед
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702665
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mibinElic,

Не могу представить такой пример, в случае выстроения всех по дате начала.
Можно пример?
Код: 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.
  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
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702709
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Noisfux,

последний интервальчик (после обединения перекрывающихся)
Код: 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.
  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
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39702782
Noisfux
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
Непрерывные периоды
    #39703097
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Noisfux,

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

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


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