2016-12-01 2 views
1

У меня есть таблица со следующей структурой:Postgres выбрать агрегированные timespans

timstamp-start, timestamp-stop 
1,5 
6,10 
25,30 
31,35 
... 

Я заинтересован только в непрерывных timespans например разрыв между отметкой времени концом и последующими метками стартом меньше 3.

Как я мог получить агрегированные охватываемые timespans в результате:

timestamp-start,timestamp-stop 
1,10 
25,35 

Причины Я рассматриваю это потому, пользователь может запросить промежуток времени, который должен был бы вернуть несколько тысяч строк. Однако большинство записей непрерывны, и использование вышеописанного метода потенциально может сократить многие тысячи строк до десятков. Или добавленный расчет не стоит сбережений в полосе пропускания и латентности?

+0

может там быть наложений в время начала и окончания? –

+0

нет, нет совпадений. Я надеюсь, что это немного упростит :) @vkp – Chris

+2

Перекрестная почта: https://dba.stackexchange.com/questions/156945/postgres-select-aggregate-timespans –

ответ

2

Вы можете сгруппировать метки времени в три этапа:

  1. Добавить флаг, чтобы определить, где начинается новый период (то есть, разрыв больше, чем 3).
  2. В совокупности суммируйте флаг для присвоения группировок.
  3. Повторно агрегировать с новыми группировками.

код выглядит следующим образом:

select min(ts_start) as ts_start, max(ts_end) as ts_end 
from (select t.*, 
      sum(flag) over (order by ts_start) as grouping 
     from (select t.*, 
        (coalesce(ts_start - lag(ts_end) over (order by ts_start),0) > 3)::int as flag 
      from t 
      ) t 
    ) t 
group by grouping; 

 Смежные вопросы

  • Нет связанных вопросов^_^