Если вы хотите извлечь разницу максимального времени дома и минимума времени вне дома, вы можете использовать
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
Демо