从度量表中筛选出未解决的错误记录

时间:2018-07-18 16:58:43

标签: sql statistics

我有一张桌子,可以存储某些车辆的行驶距离

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%的情况下仍可以正常工作。

任何建议如何计算我的覆盖距离并在此期间忽略失误?

谢谢!

1 个答案:

答案 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%准确的。它还假设异常是孤立的-这可能是一个错误的假设。但这可能会解决您的问题。