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行。