powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как склеить интервалы?
11 сообщений из 11, страница 1 из 1
как склеить интервалы?
    #39274379
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
доброе время
в таблице есть три интервала:
A: с 01.03.2016 по 15.03.2016
B: с 10.03.2016 по 17.03.2016
C: с 20.03.2016 по 25.03.2016

как можно выбрать интервалы что бы в итоге получилось 2 строки:
с 01.03.2016 по 17.03.2016
с 20.03.2016 по 25.03.2016
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274391
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

развернуть и свернуть.
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274415
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2., что вы понимаете под развернуть, свернуть

я конечно привел упрощенный вариант, где только даты, в моем случае это микросекунды. я не представляю сколько записей будет если я разверну в милесекундах.
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274422
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вижу пока такое решение на with recursive в таком виде:

A: с 01.03.2016 по 15.03.2016
B: с 16.03.2016 по 17.03.2016
C: с 20.03.2016 по 25.03.2016

меня такой вариант вполне устраивает так как надо подчитать сумарное время всех склеенных отрезков

просто думаю есть способ лучше, чем мой велосипед
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274488
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

подсмотрено в соседней ветке форума:

Код: sql
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.
--
-- Тестовый набор данных 
with
  t as 
    (
      select to_date('01.03.2016','dd.mm.yyyy') as d1, to_date('15.03.2016','dd.mm.yyyy') as d2 from dual union all
      select to_date('10.03.2016','dd.mm.yyyy') as d1, to_date('17.03.2016','dd.mm.yyyy') as d2 from dual union all
      select to_date('20.03.2016','dd.mm.yyyy') as d1, to_date('25.03.2016','dd.mm.yyyy') as d2 from dual
    )
--
-- Основной запрос (вроде все конструкции аналогичны "местному" синтаксису):
select min(d1) as x_d1, max(d2) as x_d2
  from (
         select d1, d2, sum(sog) over(order by d1,d2) as grp_id
           from (
                  select d1, d2, 
                         case 
                           when d1 <= max(d2) over(order by d1, d2 
                                                    rows between unbounded preceding
                                                                     and 1 preceding) 
                             then 0 
                           else 1 
                         end as sog -- sog = start_of_group :)
                    from t
                )
       )
 group by grp_id
 order by 1
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274498
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух ты ж. Это же ветка по PostGreSQL. Значит нужно немного подправить синтаксис запроса: убрать from dual и добавить алиасы на подзапросы.
Щукина АннаLegushka,

подсмотрено в соседней ветке форума:

Код: sql
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.
--
-- Тестовый набор данных 
with
  t as 
    (
      select to_date('01.03.2016','dd.mm.yyyy') as d1, to_date('15.03.2016','dd.mm.yyyy') as d2 union all
      select to_date('10.03.2016','dd.mm.yyyy') as d1, to_date('17.03.2016','dd.mm.yyyy') as d2 union all
      select to_date('20.03.2016','dd.mm.yyyy') as d1, to_date('25.03.2016','dd.mm.yyyy') as d2
    )
--
-- Основной запрос (вроде все конструкции аналогичны "местному" синтаксису):
select min(d1) as x_d1, max(d2) as x_d2
  from (
         select d1, d2, sum(sog) over(order by d1,d2) as grp_id
           from (
                  select d1, d2, 
                         case 
                           when d1 <= max(d2) over(order by d1, d2 
                                                    rows between unbounded preceding
                                                                     and 1 preceding) 
                             then 0 
                           else 1 
                         end as sog -- sog = start_of_group :)
                    from t
                ) v0
       ) v1
 group by grp_id
 order by 1


на всякий случай - проверка работоспособности
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274550
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

Я предпочитаю `lag` использовать, как-то привычнее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH d(f,t) AS (
  VALUES ('2016.03.01'::date, '2016.03.15'::date),
         ('2016.03.10','2016.03.17'), ('2016.03.20','2016.03.25')
)
SELECT gid, min(f),max(t)
  FROM (
    SELECT *, sum(g) OVER (ORDER BY f, t) gid
      FROM (
        SELECT f, t,
               CASE WHEN f <@ daterange(lag(f,1,current_date) OVER (ORDER BY f, t),
                                        lag(t,1,current_date) OVER (ORDER BY f, t))
                    THEN NULL ELSE 1 END g
          FROM d
           ) g
      ) x
 GROUP BY gid;



Допускаю, что это всё можно сделать “красивей” с использованием range-типов, но тут опыта нет.
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274553
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна, вам большущее спасибо, вы спасли меня от работы в велосипедном заводе-)
vyegorov, спасибо за lag-)
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274763
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovЯ предпочитаю `lag` использовать.лаг не подойдет, когда минтервалы в порядке f не пересекаются друг с другом, но пересекаются через третий.
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274828
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.лаг не подойдет, когда минтервалы в порядке f не пересекаются друг с другом, но пересекаются через третий.
Не могу представить — могли бы привести пример таких интервалов?..
...
Рейтинг: 0 / 0
как склеить интервалы?
    #39274943
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov,

1-7
2-3
5-6
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как склеить интервалы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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