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

How to get the first and last record for consecutive data in MySQL?

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

+------------+---------------------+
+ 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 的大致时间。从这个table可以看出,程序aaa有两组,第一组在开头,第二组在ddd之前。每个flagset应该独立计算。

我想计算每个连续节目的时间,简单来说,我想得到连续部分的第一个记录时间和最后一个记录时间,如:

+------------+---------------------+
+ 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 的新手。任何帮助将不胜感激!

您可以使用变量枚举组,然后聚合得到您想要的:

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;