我有一个像这样的任务表
id timestamp event_type
2 "2018-12-17 09:25:05" open
2 "2018-12-17 09:26:05" cancel
2 "2018-12-17 09:27:05" open
2 "2018-12-17 09:29:05" closed
3 "2018-12-17 09:25:05" open
3 "2018-12-17 09:28:05" closed
并且我需要基于打开事件和关闭事件之间的差异来获取数据,但仅基于上次打开事件和关闭事件之间的差异来获取数据。 例如任务2之间被取消,因此仅需要计算最后2个事件(“打开”,“关闭”)之间的差值
输出类似于
Task Time taken
2 2:00
3 3:00
我检查了一些array_agg函数,但这似乎不起作用。
答案 0 :(得分:1)
SELECT
id,
MAX(ts) FILTER (WHERE event_type = 'closed') -
MAX(ts) FILTER (WHERE event_type = 'open') as time_taken
FROM
events
GROUP BY id
答案 1 :(得分:1)
您可以在下面尝试-
select id,
DATE_PART(
'minute',
max(case when event_type='open' then timestamp end)::timestamp -
max(case when event_type='closed' then timestamp end)::timestamp
)
from tablename
group by id
答案 2 :(得分:0)
我认为lag()
是更安全的解决方案:
select id, (timestamp - prev_open_timestamp)
from (select e.*,
max(timestamp) filter (where event_type = 'open') over (partition by id order by timestamp) as prev_open_timestamp
from events e
) e
where event_type = 'closed';
即使在open
之后有close
,这也将起作用。