Как получить продолжительность с Postgresql - PullRequest
0 голосов
/ 20 февраля 2019

Нужна помощь, как рассчитать продолжительность, используя PostgreSQL.В моем примере, скажем, местоположение человека записывается в определенное время.

timestamp        location   
02JAN19:00:00:00 home
02JAN19:05:00:00 work1
02JAN19:06:00:00 work2
02JAN19:07:00:00 home

Я бы хотел сохранить только первый раз, когда этого человека не было дома, и продолжительность, когда этот человек находился вне дома.Этот человек находился вне дома с 05:00 до 06:59, это время, которое мы хотели бы рассчитать.

Таким образом, результирующий набор данных выглядит следующим образом:

timestamp location duration (in Minutes)
02JAN19:06:00:00 work2    119

1 Ответ

0 голосов
/ 20 февраля 2019

Если вы хотите извлечь разницу максимального времени дома и минимума времени вне дома, вы можете использовать

max(case when location  = 'home' then  timestamp end ) 
     - min(case when location != 'home' then timestamp end )




SELECT extract(epoch FROM max(
     CASE
          WHEN location = 'home' THEN TIMESTAMP
     END
) - min(
     CASE
          WHEN location != 'home' THEN TIMESTAMP
     END
) )::int / 60 - 1 AS duration
 from
t;

Если вы хотите, чтобы остальные столбцы были до максимальной продолжительности,

with dur as
(
SELECT extract(epoch FROM max(
     CASE
          WHEN location = 'home' THEN TIMESTAMP
     END
) - min(
     CASE
          WHEN location != 'home' THEN TIMESTAMP
     END
) )::int / 60 - 1 AS duration
 from
t ) 
select t.*,dur.duration from t cross join dur 
  order by CASE
          WHEN location != 'home' THEN TIMESTAMP
     END desc nulls last limit 1

Если вы хотите, чтобы это было для каждого человека, вы используете GROUP BY person или любой другой идентификатор, который представляет уникального человека, а затем используете DISTINCT ON, чтобы отфильтровать наибольшую временную метку вместо ORDER BY и LIMIT

Демо

...