目标是根据公式为每个波段找到极小或大的记录。
输入:
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.)
困难的部分是我不知道如何为每个乐队做这件事,这使得应用公式变得更加困难。
答案 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