如何仅按功能按组提取postgres的最后两行

时间:2018-12-21 10:30:06

标签: 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-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函数,但这似乎不起作用。

3 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

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,这也将起作用。