我有一张桌子,可以存储某些车辆的行驶距离
VEH_ID DATE DISTANCE
1 2018-07-16 12:04:03.000 439025
1 2018-07-16 12:04:33.000 439026
1 2018-07-16 12:05:03.000 439026
1 2018-07-16 12:05:33.000 439027
我想计算一段时间内的覆盖距离。看起来很简单-在给定记录的范围内执行MAX(DISTANCE)-MIN(DISTANCE)。或最后一个记录距离-第一个记录距离。
我的问题是,大约1%-4%(取决于记录的子集)的记录是完全错误的。它们是一些来自设备的测量错误。所以我的数据实际上看起来像:
VEH_ID DATE DISTANCE
1 2018-07-16 12:04:03.000 439025
1 2018-07-16 12:04:33.000 7
1 2018-07-16 12:05:03.000 439026
1 2018-07-16 12:05:33.000 439027
如果我使用MAX和MIN,则sql会找到这些记录,并且我的计算完全错误。第一个/最后一个记录也将包含错误。
我想我需要在进行计算时以某种方式过滤掉这些错误的记录。我还假设不存在100%完美的算法,但是在95%的情况下仍可以正常工作。
任何建议如何计算我的覆盖距离并在此期间忽略失误?
谢谢!
答案 0 :(得分:0)
如果值小于前一个值或大于后一个值,则可以将其过滤掉:
select d.*
from (select d.*,
lag(distance) over (partition by veh_id order by date) as prev_distance,
lead(distance) over (partition by veh_id order by date) as next_distance
from distances d
) d
where prev_distance > distance or distance > next_distance;
这不是100%准确的。它还假设异常是孤立的-这可能是一个错误的假设。但这可能会解决您的问题。