如何获取MySQL中连续数据的第一个和最后一个记录?

时间:2015-04-08 01:53:35

标签: mysql sql

我正在研究我运行的不同类型程序的执行时间。首先,我从一个查询得到了一个结果,如:

+------------+---------------------+
+ 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的新手。任何帮助将非常感谢!

1 个答案:

答案 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;