Postgres 时间戳之间的差异(以分钟为单位)

Hel*_*lmy 7 postgresql time

我正在尝试获取以下具有相同 nodeid 的数据的事件时间与计数 > 1 的 nodeid 的代码之间的时间差(以分钟为单位)

nodeid  code     event_time
CAI0015 14961045 2017-04-22 21:22:00
CAI0024 14961045 2017-04-23 19:44:00
CAI0024 14961045 2017-04-23 09:07:00
CAI0040 14971047 2017-04-23 13:58:00
CAI0046 14961045 2017-04-23 11:19:00
CAI0050 14961045 2017-04-24 02:06:00
Run Code Online (Sandbox Code Playgroud)

输出应该是这样的:

nodeid  code     difference(min)
CAI0024 14961045 637
Run Code Online (Sandbox Code Playgroud)

poz*_*ozs 13

使用公式extract(epoch from <later> - <earlier>) / 60获取时间戳差异(以分钟为单位)。

要选择表中的所有差异排列(其中nodeid&code相同),请使用自联接:

select nodeid, code, extract(epoch from e2.event_time - e1.event_time) / 60 difference
from   events e1
join   events e2 using (nodeid, code)
where  e1.event_time < e2.event_time
Run Code Online (Sandbox Code Playgroud)

nodeid然而,当给定的&对有超过 2 行时,这似乎实际上没有用code。要仅计算之前的差异,请使用lag()窗口函数

select nodeid, code, extract(epoch from event_time - lag) / 60 difference
from   (select *, lag(event_time) over (partition by nodeid, code order by event_time)
        from   events) e
where  lag is not null
Run Code Online (Sandbox Code Playgroud)

http://rextester.com/HGY2600

注意:如果所有对都最多只有 2 行,那么这两种方法只会为每个nodeid&对提供一行。code


小智 1

尝试使用dense_rank 来查找下一个事件。

SELECT t_a.*, EXTRACT(EPOCH FROM (t_a.event_time - t_b.event_time))
FROM 
(SELECT nodeid, code, event_time, dense_rank() over (partition by node_id order by event_time) as rnk
 FROM table) t_a 
JOIN
(SELECT nodeid, code, event_time, dense_rank() over (partition by node_id order by event_time) as rnk 
 FROM table) t_b 
ON (t_a.nodeid=t_b.nodeid and t_a.rnk + 1 = t_b.rnk)
Run Code Online (Sandbox Code Playgroud)