我正在研究我运行的不同类型程序的执行时间。首先,我从一个查询得到了一个结果,如:
+------------+---------------------+
+ program + start_time +
+------------+---------------------+
| aaa | 2015-04-01 22:18:13 |
| aaa | 2015-04-01 22:18:19 |
| aaa | 2015-04-01 22:18:35 |
| aaa | 2015-04-01 22:29:18 |
| bbb | 2015-04-01 22:29:32 |
| bbb | 2015-04-01 22:31:38 |
| bbb | 2015-04-01 22:41:11 |
| ccc | 2015-04-01 22:41:20 |
| ccc | 2015-04-01 22:42:01 |
| ccc | 2015-04-01 23:04:05 |
| ccc | 2015-04-01 23:04:13 |
| aaa | 2015-04-01 23:06:06 |
| aaa | 2015-04-01 23:22:40 |
| aaa | 2015-04-01 23:23:27 |
| aaa | 2015-04-01 23:24:15 |
| ddd | 2015-04-01 23:36:15 |
| ddd | 2015-04-01 23:36:17 |
| ddd | 2015-04-01 23:36:21 |
+------------+---------------------+
它以这种方式显示,因为每个程序都有不同的测试选项,因此对于每个选项,都有一个测试的开始时间。不要担心执行时间,我只想知道每个flagset的粗略时间。从这张表中我们可以看到,程序aaa有两组,第一组在开头,第二组在ddd之前。每个标志集都应该独立计算。
我想计算每个连续节目的时间,以简单的方式,我想获得连续部分的第一个记录时间和最后记录时间,如:
+------------+---------------------+
+ program + start_time +
+------------+---------------------+
| aaa | 2015-04-01 22:18:13 |
| aaa | 2015-04-01 22:29:18 |
| bbb | 2015-04-01 22:29:32 |
| bbb | 2015-04-01 22:41:11 |
| ccc | 2015-04-01 22:41:20 |
| ccc | 2015-04-01 23:04:13 |
| aaa | 2015-04-01 23:06:06 |
| aaa | 2015-04-01 23:24:15 |
| ddd | 2015-04-01 23:36:15 |
| ddd | 2015-04-01 23:36:21 |
+------------+---------------------+
之前的解决方案已经足够了。但理想情况下,最好知道每个程序的确切时间间隔,因此这个问题的理想结果将是最后一个记录时间 - 第一个记录时间,如:
+------------+---------------+
+ program + time_interval +
+------------+---------------+
| aaa | 00:11:15 |
| bbb | 00:11:39 |
| ccc | 00:22:53 |
| aaa | 00:18:09 |
| ddd | 00:00:06 |
+------------+---------------+
嗯,这不是作业,但我是MySQL的新手。任何帮助将非常感谢!
答案 0 :(得分:2)
您可以使用变量枚举组,然后聚合以获得所需内容:
select program, min(start_time), max(start_time)
from (select r.*,
(@rn := if(@p = program, @rn,
if(@p := program, @rn + 1, @rn + 1)
)
) as rn
from result r cross join
(select @p = '', @rn := 0) vars
order by program, start_time
) r
group by program, rn;