Mysql 如何在GPS跟踪器数据中找到开始和停止od中断?

Mysql 如何在GPS跟踪器数据中找到开始和停止od中断?,mysql,sql,select,gps-time,Mysql,Sql,Select,Gps Time,我有来自GPS跟踪器的数据。 比如说: CREATE TABLE IF NOT EXISTS `gps_data` ( `id` int(6) unsigned NOT NULL, `speed` int(3) unsigned NOT NULL, `time` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8; [break_start, break_stop] [07:20, 07:50] [0

我有来自GPS跟踪器的数据。 比如说:

CREATE TABLE IF NOT EXISTS `gps_data` (
  `id` int(6) unsigned NOT NULL,
  `speed` int(3) unsigned NOT NULL,
  `time` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
[break_start, break_stop]
[07:20, 07:50]
[08:32, 08:52]
[09:25, NULL]
以及一些样本数据:

INSERT INTO `gps_data` (`id`, `speed`, `time`) VALUES
  ('1', '5', '07:00'),
  ('2', '10', '07:10'),
  ('3', '0', '07:20'),
  ('4', '0', '07:30'),
  ('5', '0', '07:40'),
  ('6', '0', '07:50'),
  ('7', '20', '08:00'),
  ('8', '40', '08:10'),
  ('9', '15', '08:15'),
  ('10', '0', '08:32'),
  ('11', '0', '08:40'),
  ('12', '0', '08:52'),
  ('13', '12', '09:10'),
  ('14', '0', '09:25');
问题是如何找到速度为0的第一个和最后一个位置的时间

因此,在我的示例中,我希望有如下内容:

CREATE TABLE IF NOT EXISTS `gps_data` (
  `id` int(6) unsigned NOT NULL,
  `speed` int(3) unsigned NOT NULL,
  `time` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
[break_start, break_stop]
[07:20, 07:50]
[08:32, 08:52]
[09:25, NULL]
以下是更好理解的方法:

我开始尝试的是:

SELECT `time` AS break_start, `time` AS break_stop  FROM `gps_data` WHERE `speed`=0;

MySQL中的一种方法是为每一行分配一个组。此组可以是行之前的非零值数-具有相邻零值的所有行都在同一组中

在MySQL 8+中,您可以为此使用窗口函数:

select min(time), max(time)
from (select t.*,
             sum(speed <> 0) over (order by time) as grp
      from t
     ) t
where speed = 0
group by grp;
在早期版本中,一种方法是相关子查询:

select min(time), max(time)
from (select t.*,
             (select count(*)
              from t t2
              where t2.speed <> 0 and t2.time <= t.time
             ) as grp
      from t
     ) t
where speed = 0
group by grp;

是一个SQL FIDLE。

如果数据跨越多天怎么办?仅使用时间值将如何解决此问题?谢谢。按预期工作戈登·林诺夫:再次感谢你的帮助。我已经在我的生产数据库中测试了这个查询,但是比预期的要慢。这个查询大约18秒。在速度方面有什么可以改进的吗?@Tikky。你能问另一个关于绩效的问题吗?