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
的要求。我已经添加了有关公式的更多信息。你能看一下吗?