使用带有条件运算符的Min / Max

时间:2011-02-28 23:16:46

标签: sql

我正在尝试运行查询以查找最大值和最小值,然后使用条件运算符。但是,当我尝试运行以下查询时,它会给出错误 - “滥用聚合:min()”。

我的查询是:

SELECT a.prim_id, min(b.new_len*36) as min_new_len, max(b.new_len*36) as max_new_len
FROM tb_first a, tb_second b
WHERE a.sec_id = b.sec_id AND min_new_len > 1900 AND max_new_len < 75000
GROUP BY a.prim_id
ORDER BY avg(b.new_len*36);

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

您需要使用HAVING子句按包含聚合的表达式进行过滤。

如果您使用的是MySQL,则可以将该子句中的列别名用于其他不能使用的RDBMS。

SELECT a.prim_id,
       min(b.new_len * 36) as min_new_len,
       max(b.new_len * 36) as max_new_len
FROM   tb_first a
       JOIN tb_second b
         ON a.sec_id = b.sec_id /*<-- Use explicit JOIN syntax...*/
GROUP  BY a.prim_id
HAVING min(b.new_len * 36) > 1900
       AND max(b.new_len * 36) < 75000 
ORDER  BY avg(b.new_len * 36);  

在许多RDBMS中,您还可以将查询放入内联视图中并从中进行选择以使用列别名而不是重复公式。在这种情况下,您可以使用WHERE,如下所示。

SELECT prim_id,
       min_new_len,
       max_new_len
from   (SELECT a.prim_id,
               min(b.new_len * 36) as min_new_len,
               max(b.new_len * 36) as max_new_len,
               avg(b.new_len * 36) as avg_new_len
        FROM   tb_first a
               JOIN tb_second b
                 ON a.sec_id = b.sec_id
        GROUP  BY a.prim_id) derived
WHERE  min_new_len > 1900
       AND max_new_len < 75000
ORDER  BY avg_new_len;  

答案 1 :(得分:1)

WHERE子句在聚合之前过滤单个“输入”记录。

HAVING子句在聚合后过滤生成的“输出”记录。

马丁发布答案。