Sql 如何使用group by函数仅获取最后两行postgres
我有一个这样的任务表Sql 如何使用group by函数仅获取最后两行postgres,sql,postgresql,Sql,Postgresql,我有一个这样的任务表 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-1
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
我检查了一些数组agg函数,但似乎不起作用。
你可以在下面试试-
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
你可以在下面试试-
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
我认为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';
即使在关闭后出现打开
的情况下,这也会起作用。我认为滞后()
是一种更安全的解决方案:
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';
即使在关闭后有打开
的情况下,这也会起作用。Postgres中没有datediff。Postgres中没有datediff