将 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子句中计算
这样的子查询至少需要 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`,
用 table 的任何名称替换 tablename
。
我有一个 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子句中计算
这样的子查询至少需要 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`,
用 table 的任何名称替换 tablename
。