2017-10-10 61 views
1

我想计算没有异常值的平均值(带有2个标准偏差)。我不断收到错误消息“聚合不应出现在WHERE子句中,除非它是在含有HAVING子句或选择列表在子查询中,并且被聚合的列是外部引用。如何计算没有异常值的平均值

select 
    b.[Location], 

    b.[txtOrderSubType], 

    avg (DATEDIFF(MINUTE, b.[dteActualStartDate], b.[dteActualEndDate])) as 
[Avg Duration in min], 


from dbo.tbl1 
Where   
    DATEDIFF(MINUTE, b.[dteActualStartDate], b.[dteActualEndDate])< ( 
    AVG(DATEDIFF(MINUTE, b.[dteActualStartDate], b.[dteActualEndDate]))+ 
    2*STDEVP(DATEDIFF(MINUTE, b.[dteActualStartDate], b.[dteActualEndDate]))) 

and DATEDIFF(MINUTE, b.[dteActualStartDate], b.[dteActualEndDate])> ( 
     AVG(DATEDIFF(MINUTE, b.[dteActualStartDate], b.[dteActualEndDate]))- 
     2*STDEVP(DATEDIFF(MINUTE, b.[dteActualStartDate], b.[dteActualEndDate]))) 

    group by b.[Location], b.[txtOrderSubType] 

回答

0

在一个水平,问题是没有意义的,因为一般的变化。虽然我会回答这个问题,你可能想离群的其他一些定义。

select avg(al) 
from (select t.*, avg(val) over() as avg_val, stdev(val) over() as stdev_val 
     from t 
    ) t 
where val between avg_val - 2 * stdev_val and avg_val + 2 * stdev_val; 

我不知道如何融入您的查询,这似乎是不必要的复杂。