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

时间:2016-06-07 18:53:45

标签: mysql max where

我有一个警报表,其中包含各种值,包括严重性和过时的标志,都是int。

我正在尝试构建一个CASE语句,如果所有语句都已过时,将返回最小严重性(1),并且如果存在非过时警报,则获取未过时的最大严重性。

过时只会是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`,

但我收到错误:

  

语法错误:缺少'右括号'

以下作为有效的SQL工作,但即使它已过时也会返回最大值:

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

基本上,如何获得列的最大值,不包括与WHERE匹配的行?

2 个答案:

答案 0 :(得分:2)

这样的子查询至少需要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`,

tablename替换为任何表的名称。

答案 1 :(得分:1)

你应该在条件中使用聚合函数(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)

只能在有子句

的情况下评估聚合结果