2017-04-24 36 views
0

我试图让具有相同NODEID和编码具有计数NODEID> 1Postgres的差异

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 

输出应该像下面这样的数据的事件时间之间分钟的时间差:

nodeid code  difference(min) 
CAI0024 14961045 637 
+0

请提供预期的输出以及迄今所做的工作。 (也就是说,我们需要知道你想要计算的差异:它是实际的行和前一个的差异,还是所有的差异,其中'nodeid'&'code'是相同的?) – pozs

+0

问题已更新,它应该是所有行都具有相同的nodeid和代码 – Helmy

回答

0

尝试使用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) 
1

使用以分钟为单位获得时间戳差异。

要选择的表内的差异(其中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 

然而,这似乎并没有被真正有用的,当你有更多对于给定的nodeid & code对,要计算只是以前的区别,使用lag() window function

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 

http://rextester.com/HGY2600

:这两个给你只有一排,每nodeid & code对,如果只你所有配对都有最多2行。