Разделение и агрегация интервалов в ведра - PullRequest
0 голосов
/ 09 ноября 2018

Я успешно использую функцию PostgreSQL width_bucket(val, min, max, buckets), чтобы разделить мой набор данных на блоки одинакового размера. Но мои данные содержат временные диапазоны в миллисекундах (start_time и end_time). Я ищу способ включить строку в несколько сегментов на основе временного интервала.

Это пример того, где я сейчас нахожусь. У меня есть начальные и конечные сегменты для каждой строки:

 start_time |    end_time    | start_bucket |  end_bucket 
------------+----------------+--------------+------------
       0    |      492       |     1        |      1
     404    |      580       |     1        |      1
       0    |      628       |     1        |      1
     560    |      740       |     1        |      2
     644    |      720       |     1        |      2
      24    |      160       |     1        |      1
       0    |       88       |     1        |      1
     640    |     1268       |     1        |      2
     556    |      716       |     1        |      1
       0    |     2086       |     1        |      3

Я ищу агрегированный результат:

   bucket   |    count   
------------+---------------
       1    |       10      
       2    |        4      
       3    |        1

Я знаю, как достичь результата, если учту только start_time или end_time . Есть ли способ объединить то, что я имею сейчас, в желаемый результат?

1 Ответ

0 голосов
/ 09 ноября 2018

Использование generate_series():

select gs.bucket, count(*)
from t cross join lateral
     generate_series(t.start_bucket, t.end_bucket) as gs(bucket)
group by gs.bucket
order by 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...