我有下表
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米)
最好的方法是什么?
答案 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"
然后,您可以使用子查询或其他逻辑来获得大跳跃。