Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:高效地计算花费的时间_Sql_Postgresql_Select_Join_Group By - Fatal编程技术网

SQL:高效地计算花费的时间

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 <

给定事件时间戳列表,如何计算所花费的时间?花费的时间是每个时间戳之间的时间间隔总和,忽略超过某个阈值(例如1分钟)的时间间隔,在此期间用户可能处于非活动状态

我试过这样的方法:

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分钟的忽略间隔。但是,是的,窗口函数是答案。为什么这比联接更有效?上面的查询只从表中读取一次数据,而联接必须读取表两次,并合并来自两个数据源的行,这比简单读取更昂贵。