如何获取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;
我正在调查我 运行 的不同类型程序的执行时间。首先,我得到了一个查询的结果,例如:
+------------+---------------------+
+ 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;