查找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
然后,您可以使用子查询或其他逻辑来获得较大的跳转。时间跳转不是更好的指示吗?是的,通常不会在正常时间跳转