如何对where子句中的数据字段和聚合函数进行算术运算?

Posted

技术标签:

【中文标题】如何对where子句中的数据字段和聚合函数进行算术运算?【英文标题】:How to do arithmetic operations on data fields and aggregate functions in where clause? 【发布时间】:2013-05-13 12:20:24 【问题描述】:

我正在使用此查询返回浮点字段在其平均值附近的分布:

SELECT  COUNT(*) AS [Count], Result FROM    (
  SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM Results)
GROUP  BY Result

此查询返回所有记录之间的距离和平均值。现在,我需要过滤超出 ±3SD 范围的记录。我想也许我可以通过将查询更改为此轻松实现这一点:

SELECT  COUNT(*) AS [Count], Result FROM    (
  SELECT ROUND(Result - AVG(Result) OVER(), 1) Result FROM Results 
    HAVING Abs(Result - AVG(Result)) OVER() < 3 * STDEV(Result) OVER())
GROUP  BY Result

但是 SQL Server 给了我两个错误:

HAVING 子句中的“Results.Result”列无效,因为它是 不包含在聚合函数或 GROUP BY 子句中。

窗口函数只能出现在 SELECT 或 ORDER BY 子句中。

我怎样才能实现我正在寻找的东西? Google 今天对我不友好 :-(

【问题讨论】:

【参考方案1】:

正如第二条错误消息所示,窗口函数只能出现在 SELECT 或 ORDER BY 子句中 - 因此与其将它们包含在 HAVING 子句中,不如将它们包含在内部 SELECT 中,然后在外部 WHERE 子句中选择它们 -像这样:

SELECT  COUNT(*) AS [Count], Result FROM    
(SELECT ROUND(Result - AVG(Result) OVER(), 1) Result,
        Abs(Result - AVG(Result) OVER()) avgdiff,
        STDEV(Result) OVER() stddev
 FROM Results) r
WHERE avgdiff < 3 * stddev
GROUP  BY Result

【讨论】:

以上是关于如何对where子句中的数据字段和聚合函数进行算术运算?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中的开窗函数是啥?

聚合函数字段注意.where和having的区别

SQL Server中的聚合函数都有哪些?

为啥聚合函数不能放在where后面?

SQL中的WHERE子句中为啥不允许应用聚集函数呢?请通俗的解释一下或者谈谈自己的见解!

为啥聚集函数不能出现在where子句中