SQL:高效地计算花费的时间
给定事件时间戳列表,如何计算所花费的时间?花费的时间是每个时间戳之间的时间间隔总和,忽略超过某个阈值(例如1分钟)的时间间隔,在此期间用户可能处于非活动状态 我试过这样的方法:SQL:高效地计算花费的时间,sql,postgresql,select,join,group-by,Sql,Postgresql,Select,Join,Group By,给定事件时间戳列表,如何计算所花费的时间?花费的时间是每个时间戳之间的时间间隔总和,忽略超过某个阈值(例如1分钟)的时间间隔,在此期间用户可能处于非活动状态 我试过这样的方法: select sum(finish - start) from (select start.time as start, finish.time as finish from events start, events finish where start.time <
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;
但事实证明,这种做法效率极低,而且从未停止过
select sum(time-lag(time) over (order by time)) from events
我不确定您为什么要以这种方式将事件连接到自身,但这很可能是查询永远运行的原因,而不是因为琐碎的聚合计算。使用:
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
演示:您能发布一些示例数据和预期结果吗?那就是帮助别人快速帮助你这不满足超过1分钟的忽略间隔。但是,是的,窗口函数是答案。为什么这比联接更有效?上面的查询只从表中读取一次数据,而联接必须读取表两次,并合并来自两个数据源的行,这比简单读取更昂贵。