【问题标题】:How to select from mysql data with min and max timestamp for each group of rows如何从mysql数据中选择每组行的最小和最大时间戳
【发布时间】:2014-05-09 04:10:14
【问题描述】:

我有一个 mysql 表,其中包含来自汽车 gps 跟踪器的数据(纬度、lng、速度、时间)。我想选择汽车停止(速度 = 0)超过 10 分钟、30 分钟、1 小时等的位置(纬度、经度和时间)。

我的桌子是这样的:

id 纬度 经度 速度 时间 -------------------------------------------------- --------------------- 304 52.388983333333336 17.025338333333334 33.67 2014-03-26 08:00:04 305 52.39029 17.023776666666667 34.65 2014-03-26 08:00:14 306 52.391035 17.021631666666668 32.91 2014-03-26 08:00:24 307 52.39103166666666 17.01917 30.03 2014-03-26 08:00:34 308 52.39089833333333 17.01698 29.33 2014-03-26 08:00:44 309 52.390593333333335 17.01532 9.54 2014-03-26 08:00:54 310 52.39071333333333 17.015056666666666 0 2014-03-26 08:01:04 311 52.39105333333333 17.01499 10.3 2014-03-26 08:01:14 312 52.391485 17.01488 7.82 2014-03-26 08:01:24 313 52.391705 17.014815 0 2014-03-26 08:01:34 314 52.391705 17.014815 0 2014-03-26 08:01:44 315 52.391705 17.014815 0 2014-03-26 08:01:54 316 52.391705 17.014815 0 2014-03-26 08:02:04 317 52.391705 17.014815 0 2014-03-26 08:02:14 318 52.391705 17.014815 0 2014-03-26 08:02:24 319 52.39232333333333 17.014648333333334 7.12 2014-03-26 08:02:34 320 52.392345 17.014635 0 2014-03-26 08:02:44 321 52.392345 17.014635 0 2014-03-26 08:02:54 322 52.392345 17.014635 0 2014-03-26 08:03:04 323 52.392345 17.014635 0 2014-03-26 08:03:15 324 52.392345 17.014635 0 2014-03-26 08:03:25 325 52.392345 17.014635 0 2014-03-26 08:03:35 326 52.392558333333334 17.014471666666665 14.11 2014-03-26 08:03:45 327 52.392316666666666 17.012883333333335 27.47 2014-03-26 08:03:55 328 52.39194333333333 17.010871666666667 28.93 2014-03-26 08:04:05 329 52.39152333333333 17.00893 22.28 2014-03-26 08:04:15 330 52.391575 17.007181666666668 27.01 2014-03-26 08:04:25 331 52.39164 17.00501 26.48 2014-03-26 08:04:35 332 52.39159333333333 17.002895 28.34 2014-03-26 08:04:45 333 52.391641666666665 17.000795 26.39 2014-03-26 08:04:55 334 52.392156666666665 16.999178333333333 16.56 2014-03-26 08:05:05 335 52.39223666666667 16.998796666666667 0 2014-03-26 08:05:15 336 52.39234 16.99819 15.38 2014-03-26 08:05:25 337 52.39261166666667 16.996865 17.1 2014-03-26 08:05:35 338 52.392896666666665 16.995643333333334 20.91 2014-03-26 08:05:45 339 52.39313666666666 16.99468 7.5 2014-03-26 08:05:55 340 52.39331833333333 16.993918333333333 9.1 2014-03-26 08:06:05 341 52.3936 16.992806666666667 16.86 2014-03-26 08:06:15 342 52.393746666666665 16.992065 4.72 2014-03-26 08:06:25

寻求帮助,有什么想法吗?

【问题讨论】:

  • 我正在考虑选择所有记录并写入 php for 循环,检查 speed=0 是否节省了这一行的时间,并等待另一个速度 >0 的记录。在那之后计算第一次和最后一次之间的差异。我现在没有任何其他想法,但我认为这不是一个好的解决方案。我敢打赌有更好的解决方案,所以我在这里寻求帮助。

标签: mysql sql select gps timestamp


【解决方案1】:

您需要为每个“0”记录添加一个标识符,以便将它们组合在一起。一种简单的衡量标准是数据中非零记录的数量。

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

然后您可以使用having 子句来获取您感兴趣的行:

having max(time) >= min(time) + interval 1 hour

例如。

【讨论】:

  • 你的想法看起来很有希望,但你的选择在这里有一个语法:
    select t.* (select count(*) from table t2 where t2.time  0 ) as grp
    我在 mysql 选择方面没有那么好我找不到它为什么不起作用:(
  • 我更改了表名 :) 其他地方有问题:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在第 3 行的 '(select count(*) from position t2 where t2.time 附近使用
猜你喜欢
  • 2015-04-20
  • 1970-01-01
  • 2014-01-16
  • 2019-10-26
  • 2021-10-31
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多