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