【发布时间】:2016-03-28 20:15:03
【问题描述】:
我正在寻找一个优雅的查询来获得忽略零值的平均值。
示例:我有 2 个值和预期结果:
SELECT X(10,20) AS result
-- expected result: 15
SELECT X(0,20) AS result
-- expected result: 20
SELECT X(10,0) AS result
-- expected result: 10
SELECT X(0,0) AS result
-- expected result: NULL
这是我的尝试:
(val1+val2)/(2-IF(val1,0,1)-IF(val2,0,1))
还有更好的方法吗?
谢谢
【问题讨论】:
-
对于仅使用内置 MySQL 函数的表达式,这几乎可以达到预期效果。一个小调整:您可以在分母中添加值,而不是从 2 中减去它们。例如
(val1+val2)/(IF(val1,1,0)+IF(val2,1,0)) -
@spencer7593 ,缩短它是个好主意!
-
我看不出让它更优雅。我对
ABS(SIGN())模式的偏爱可能是由于两件事:1) 处理 NULL 值。使用ABS(SIGN()),我们可以取回 0、1 或 NULL。使用 IF() 函数,我们只会返回 0 或 1。(只需选择最符合您的规范的那个。)和 2) 我早期的保留... Oracle 没有灵活的 IF() 函数。我倾向于使用 DB2、Teradata 和 Oracle 中可用的表达式和函数(在可行的情况下)。 (并且 SIGN 技巧在 OracleDECODE中非常方便。)