2017-07-08 77 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分钟的时间间隔”。但是,窗口函数就是答案。 –