需要帮助如何使用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 AM在家外面,我们想要计算这段时间。
因此,结果数据集如下:
timestamp location duration (in Minutes)
02JAN19:06:00:00 work2 119
如果您想提取家中最长时间的差异和不在家的最短时间,您可以使用
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
或任何代表独特的人的id然后使用DISTINCT ON
过滤掉最大的时间戳而不是ORDER BY
和LIMIT