找到mysql中后续或前一列之间存在异常差异的列

时间:2017-01-20 11:12:52

标签: 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秒的间隔发送数据,但有时他们可以离线并仅在线上发送数据。只有,找出这种方法才能找到不寻常的距离跳跃。我们可以假设一些正常跳跃(500米)

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

通常你可以使用窗口函数来执行这样的任务 - LEAD和LAG是完美的。但是,由于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

如果您可以假设每个vehicle_id的id是顺序的(没有间隙),那么您可以使用它而不是rownr。否则你必须让你自己的排名/行号。

所以你必须结合这个问题的排名解决方案: MySQL - Get row number on select

答案 1 :(得分:1)

如果你不能确保id增加没有间隙,那么你需要另一种方法。一种方法使用变量,一种使用相关子查询。

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

# prevent mime based attacks
Header set X-Content-Type-Options "nosniff"

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