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

use*_*501 3 sql

我试图运行查询以查找最大值和最小值,然后使用条件运算符.但是,当我尝试运行以下查询时,它给出了错误 - "滥用aggregate: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);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Mar*_*ith 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);  
Run Code Online (Sandbox Code Playgroud)

在许多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;  
Run Code Online (Sandbox Code Playgroud)