Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找mysql中前后列之间存在异常差异的列_Mysql_Sql - Fatal编程技术网

查找mysql中前后列之间存在异常差异的列

查找mysql中前后列之间存在异常差异的列,mysql,sql,Mysql,Sql,我有下表 id vehicle_id timestamp distance_meters 1 1 12:00:01 1000 2 1 12:00:04 1000.75 3 1 15:00:06 1345.0(unusual as time and distance jumped) 4 1 15:00:09 1347 上表是车辆的日志。通常,车辆以3秒的间隔发送数据,但有时他们可以脱机并

我有下表

id  vehicle_id  timestamp distance_meters
1   1           12:00:01  1000 
2   1           12:00:04  1000.75
3   1           15:00:06  1345.0(unusual as time and distance jumped)
4   1           15:00:09  1347
上表是车辆的日志。通常,车辆以3秒的间隔发送数据,但有时他们可以脱机并仅在联机时发送数据。唯一的办法就是找出不寻常的跳跃距离。我们可以假设一些正常的跳跃为(500米)


最好的方法是什么?

通常你可以使用窗口功能来完成这类任务-提前和延迟非常适合。然而,由于mysql中没有窗口函数,您必须模拟它们

您需要使用行号获取数据集,然后使用偏移量为1的行号将其自身连接起来

它看起来像这样:

SELECT
  *
FROM (SELECT
  rownr,
  vehicle_id,
  timestamp,
  distance_meters
FROM t) tcurrent
LEFT JOIN (SELECT
  rownr,
  vehicle_id,
  timestamp,
  distance_meters
FROM t) tprev
  ON tcurrent.vehicle_id = tprev.vehicle_id
  AND tprev.rownr = tcurrent.rownr - 1
如果您可以假设每个车辆id的id是连续的(没有间隙),那么您可以使用它而不是rownr。否则,您必须创建自己的排名/行号

因此,您必须结合此问题的排名解决方案:

如果无法确保ID增量没有间隙,则需要另一种方法。一种方法使用变量,另一种方法使用相关子查询

变量很混乱,但可能是最快的方法:

select t.*,
       (case when @tmp_prev_ts := @prev_ts and false then NULL     -- never happens
             when @prev_ts := timestamp and false then NULL        -- never happens
             else @tmp_prev_ts
        end) as prev_timestamp,
       (case when @tmp_prev_d := @prev_d and false then NULL       -- never happens
             when @prev_d := distance_meters and false then NULL   -- never happens
             else @tmp_prev_d
        end) as prev_distance_meters
from t cross join
     (select @prev_ts := '', @prev_d := 0) params
order by timestamp;  -- assume this is the ordering

然后,您可以使用子查询或其他逻辑来获得较大的跳转。

时间跳转不是更好的指示吗?是的,通常不会在正常时间跳转