0

我正在寻找一种方法来对 SQL Server 中的一列数据执行基本的异常值过滤。

背景

我有一个日志表,其中包含各种操作以及这些操作发生的时间。我正在寻找一些围绕两种不同日志事件类型之间平均时间的数据。我正在使用一个简单的查询(DATEDIFF在时间戳之间使用)来捕获这些事件之间的持续时间。目前,我使用一个AVG函数来获取这两个事件发生的所有配对实例的平均时间。

问题

我想在使用以下方法进行平均之前对数据集执行异常值过滤:

Y is an outlier if Y < (Q1 - 1.5 * IQR) 
    OR
Y is an outlier if Y > (Q3 + 1.5 * IQR)

Where Q1 is the first quartile boundary value, 
      Q3 is the third quartile boundary value,
      and IQR is Q3 - Q1.

我的问题是首先 - 在 SQL 中确定四分位数的最佳方法是什么,其次是 - 有没有一种方法可以将其存储为它自己的聚合函数来过滤然后平均?

4

1 回答 1

3

假设您使用的是 SQL Server 2005 或更高版本,因为您想要做的事情需要窗口函数。

select t.*
from t cross join
     (select min(y) as q1, max(y) as q3, max(y) - min(y) as iqr
      from (select y,
                   row_number() over (order by y) as seqnum,
                   count(*) over (partition by null) as total
            from t
           ) t
      where seqnum = cast(total*0.25 as int) or seqnum = cast(total*0.75 as int)
     ) qs
 where (y < q1 - 1.5*iqr) or (y > q3 + 1.5*iqr)

关于这是如何工作的一些注释。qs 子查询显式计算四分位数——通过对行进行排序(按 y)并获取数据中 25% 和 75% 的行的值。请注意,比较会将序列号与总行数乘以该分数转换回整数

group by 只是将这些值放在一行中,用于每次计算。where 子句是您要申请排除的逻辑。

于 2012-06-08T21:32:37.677 回答