SQL查询根据几个条件查找持续时间

时间:2019-06-30 20:49:14

标签: sql

我有一个名为status的表,其中包含以下数据:

time       var  value
12:00:01    a   10
12:00:01    b   10
12:00:01    c   12
12:00:05    a   9
12:00:05    b   10
12:00:05    c   10
12:00:10    a   13
12:00:10    b   1
12:00:10    c   4
14:00:01    a   12
14:00:01    b   11
14:00:01    c   9
14:00:41    a   9
14:00:41    b   9
14:00:41    c   3

现在,我想找到A > 10B > 10的持续时间 我希望答案为:44秒(持续时间从12:00:01到12:00:05 = 4秒,持续时间从14:00:01到14:00:41 = 40秒,总计44秒) 我尝试过:

SELECT sum(time) as duration FROM status WHERE A>10 AND B>10;

1 个答案:

答案 0 :(得分:0)

这是一个缺口和孤岛问题,可以使用累积和来解决。 lag()用于确定岛的起点。累积和定义组。

众所周知,SQL日期/时间函数与数据库有关。因此,以下给出了正确的想法,但它可能无法直接在您的数据库中工作。因此,条件发生的时间由以下查询返回:

select min(time), max(time)
from (select t.*,
             sum(case when a < 10 or b < 10 then 1 else 0 end) over (order by time) as grp
      from status t
     ) t
where a > 10 and b > 10;

sum()是对此的汇总。例如:

select sum(maxtime - mintime)
from (select max(time) as maxtime, min(time) as mintime
      from (select t.*,
                   sum(case when a < 10 or b < 10 then 1 else 0 end) over (order by time) as grp
            from status t
           ) t
      where a > 10 and b > 10
     ) t