查找每个记录带的异常值

时间:2017-06-27 19:58:59

标签: sql sql-server sql-server-2008

目标是根据公式为每个波段找到极小或大的记录。

输入:

Distance Rate
10       5
25       200
50       300
1000     5
2000     2000

乐队由我的输入定义。例如,我想为这个输入设置两个波段(实际上有更多,比如10个波段)的距离:1-100,101-10000。

对于每个频段,我们希望通过公式f找到所有速率为异常值的记录(如果您对公式感兴趣,则与平均值有两个标准偏差)

我想使用的公式f

(Rate- avg(Rate) over ()) / (stddev(Rate) over ()) > 2

输出:

Distance Rate
10       5
1000     5 (this number is for illustrative purpose only.)

困难的部分是我不知道如何为每个乐队做这件事,这使得应用公式变得更加困难。

1 个答案:

答案 0 :(得分:0)

如果不知道你打算如何应用你的公式(我的猜测是UDF),你可以通过CASE表达式分组来创建你的“乐队”:

GROUP BY CASE
  WHEN Distance BETWEEN 1 AND 100 THEN 'Band1'
  WHEN Distance BETWEEN 101 AND 10000 THEN 'Band2'
  ETC
END

类似地,您在RANK()OVER()函数中使用相同的CASE表达式,如果这对您的查询的其余部分更有效。

编辑:根据您的说明,您需要在WHERE子句中使用相关的子查询来处理此问题。我会考虑将其封装在UDF中,以使主查询看起来更清晰。类似的东西:

WHERE (Rate- {Correlated query to select the AVG(rate) of all rows in this band (using the above CASE statement to determine "this band"} over ()) / (stddev(Rate) over ()) > 2