将 SQL MAX 限制为匹配 WHERE 子句的行

Limit a SQL MAX to rows matching a WHERE clause

我有一个 table 警报,它们具有各种值,包括严重性和已过时的标志,两者都是整数。

我正在尝试构建一个 CASE 语句,该语句将 return 如果所有警报都已过时,则为最低严重性 (1),如果有未过时的警报,则将获得未过时的最大严重性。

Obsolete 永远只会是 0 或 1,所以如果所有警报的总和和所有警报的计数相同,它们都已过时,我遇到了另一种情况的问题(有些情况已过时,但其他情况已过时)不是并且忽略了过时的严重性)。

这看起来像下面这样简单的东西应该有效:

(CASE
   WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) THEN MIN(`al`.`SEVERITY`)
   ELSE (MAX(`al`.`SEVERITY`) WHERE `al`.`OBSOLETE` != 1)
END) AS `overallSeverity`,

但我收到错误:

Syntax error: missing 'closing parenthesis'

以下有效 SQL 但即使已过时也会 return 最大值:

(CASE
   WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) THEN MIN(`al`.`SEVERITY`)
   ELSE (MAX(`al`.`SEVERITY`))
 END) AS `overallSeverity`,

基本上,我怎样才能得到不包括与 WHERE 匹配的行的列的最大值?

您应该在具有条件而不是在

中使用聚合函数(sum、max、min、avg..)
select  .......
from ...
where 
having (CASE
  WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) THEN MIN(`al`.`SEVERITY`)
   ELSE (MAX(`al`.`SEVERITY`))
  END)

聚合结果只能在having子句中计算

这样的子查询至少需要 SELECTFROM 子句:

(CASE
   WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) 
   THEN MIN(`al`.`SEVERITY`)
   ELSE (SELECT MAX(`al`.`SEVERITY`) FROM tablename WHERE `al`.`OBSOLETE` != 1)
END) AS `overallSeverity`,

用 table 的任何名称替换 tablename