Как выполнять логические операции с периодами времени в Postgres? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть несколько периодов времени:

Mobile Event Time
  A    START 13:00
  B    START 13:05
  A    STOP  14:00
  B    STOP  14:05
  A    START 15:00
  A    STOP  16:00

Как я могу выполнять логические операции с такими данными, чтобы я мог получить:

Mobile Event Time
A | B  START 13:00
A | B  STOP  14:05
A | B  START 15:00
A | B  STOP  16:00

и

Mobile Event Time
A & B  START 13:05
A & B  STOP  14:00

1 Ответ

0 голосов
/ 19 июня 2018

Если я правильно понимаю ваши требования, то «логические операции», вероятно, не лучший способ описать их;они действительно устанавливают операции пересечения и объединения (хотя эти два тесно связаны).

Операторы диапазона Postgres могут вычислять объединения и пересечения, поэтому это может помочь начать с объединения парыметки времени начала / конца (как в ваш предыдущий вопрос ) для построения tsrange значений .

Как только это будет на месте, нахождение пересечения (A & B) будетотносительно просто:

WITH time_pair AS (
  SELECT *, lead("time") OVER (PARTITION BY mobile ORDER BY "time") AS next_time
  FROM events
  WHERE event IN ('START', 'STOP')
),
time_range AS (
  SELECT mobile, tsrange("time", next_time) AS period
  FROM time_pair
  WHERE event = 'START'
)
SELECT 'A & B', a_range.period * b_range.period
FROM time_range a_range
JOIN time_range b_range ON
  a_range.period && b_range.period
WHERE
  a_range.mobile = 'A' AND
  b_range.mobile = 'B';

Объединение (A | B) немного сложнее;если диапазон перекрывается на обоих концах, то для каждой выходной строки есть (как минимум) три диапазона, поэтому одного JOIN будет недостаточно.

С другой стороны, эта проблема заключается внемного более общий, поскольку вы можете просто объединить любые перекрывающиеся диапазоны без учета того, от какого именно пользователя они произошли, так что будет немного проще найти существующие реализации. Этот ответ кажется довольно полным.Вы можете найти еще несколько, выполнив поиск "postgres агрегирование диапазона" .

...