Sql 查找每个记录带的异常值

Sql 查找每个记录带的异常值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,目标是根据一个公式为每个乐队找到非常小或非常大的唱片 输入: Distance Rate 10 5 25 200 50 300 1000 5 2000 2000 标注栏由我的输入定义。例如,我希望这个输入有两个波段(实际上还有更多,比如10个波段)用于距离:1-100101-10000 对于每个波段,我们希望通过公式f(如果您对公式感兴趣,离平均值有两个标准差)找到比率为异常值的所有记录 我想用的公式f (Rate-avg(Rate)over

目标是根据一个公式为每个乐队找到非常小或非常大的唱片

输入:

Distance Rate
10       5
25       200
50       300
1000     5
2000     2000
标注栏由我的输入定义。例如,我希望这个输入有两个波段(实际上还有更多,比如10个波段)用于距离:1-100101-10000

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

我想用的公式
f

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

输出:

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

困难的部分是,我不知道如何为每个波段执行此操作,这使得应用公式更加困难。

在不知道如何应用公式(我猜是UDF)的情况下,您可以通过按大小写表达式分组来创建“波段”:

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

什么是“唱片带”?问题的哪一部分是问题?一个示例查询将非常有用。例如,如何分配标注栏?@GordonLinoff我将其解释为一组行,其中某列的值在任意范围内。@TabAlleman是的。让我在问题中做更多的解释。如果一个频带中有多个异常值,您希望得到什么输出?@TabAlleman我想要所有异常值,只要它们满足公式
f
的要求。我已经添加了有关公式的更多信息。你能看一下吗?