2017-07-08 78 views
1

給定事件時間戳列表,您如何計算「花費的時間」? 「花費的時間」是每個時間戳之間的時間間隔的總和,忽略高於特定閾值的時間間隔,例如, 1分鐘,在此期間用戶可能不活躍。SQL:高效計算花費的時間

我想是這樣的:

select sum(finish - start) 
from (select start.time as start, 
      finish.time as finish 
     from events start, events finish 
     where start.time < finish.time and 
      finish.time - start.time < interval '1 minute' 
     group by start.time) as intervals; 

但是,事實證明大大低效,永不終止。

+0

你可以張貼一些示例數據和預期的結果?這會幫助他人快速幫助你。 :) –

回答

2

用途:

SELECT SUM (time_interval_up_to_1_min) 
FROM (
    SELECT 
     CASE WHEN time - lag(time) over (ORDER BY time) 
       <= interval '1' minute 
      THEN time - lag(time) over (ORDER BY time) 
     END As time_interval_up_to_1_min 
    FROM events 
) x 

演示:http://sqlfiddle.com/#!17/6f814/7

+0

爲什麼這比聯接更高效? – Will

+0

上面的查詢只從表中讀取數據一次,而連接必須讀取表兩次,併合並來自兩個數據源的行,這比簡單讀取更昂貴。 – krokodilko

1
select sum(time-lag(time) over (order by time)) from events 

我不知道你爲什麼以那種方式參加活動,自己偏偏查詢運行下去不是小事累計計算的,因爲這是最有可能的。

+0

這不符合「忽略超過1分鐘的時間間隔」。但是,窗口函數就是答案。 –