我有一个警报表,其中包含各种值,包括严重性和过时的标志,都是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匹配的行?
答案 0 :(得分:2)
这样的子查询至少需要SELECT
和FROM
条款:
(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)
只能在有子句
的情况下评估聚合结果