从组合 COLUMNS 中查找 LEAST/GREATEST 值,忽略 0 和 NULL- MYSQL
Finding LEAST/GREATEST values from combined COLUMNS, ignore 0 & NULL- MYSQL
我有一个数据集,其中包含每个帐户的月薪支付行。我们有 6 列 -
Salary_1、Salary_2、Salary_3、Salary_4、Salary_5 和 Salary_6.
有时薪水 3、4、5、6 和偶尔 2 未填充,有时 none 填充是因为他们失业。在这种情况下,我们在字段中有 0。
我需要做的是合并所有薪水并从这些列中找到 MAX 和 MIN ---
Select
Greatest(Salary_1, Salary_2, Salary_3, Salary_4, Salary_5, Salary_6) as MaxSal,
Least(COALESCE(Salary_1, Salary_2, Salary_3, Salary_4, Salary_5, Salary_6),0) as MinSal
from
(select
sal1 as Salary_1, Select sal2 as Salary_2, Sal3 as Salary_3, sal4 as Salary_4, Sal5 as Salary_5, Sal6 as Salary_6
from ....)a
问题是,这为 Max Sal 返回了正确的值,但为 Min 返回了 0.00,因为它是最小值但不会让我忽略 0,但在这种情况下 0 不是最低工资值我想要,我需要这里的第二个最低值。
我已经尝试将原始的 Sal1-Sal6 值设置为 NULLIF 0,它 returns NULL 表示最大值,0 表示最小值。
我还能看什么? COALESCE 与 NULLIF 相结合对我不起作用,这是在之前的问题中推荐的。谢谢!
Greatest 和 Least 不会像聚合函数那样忽略空值;你需要做一些事情来避免它们。一种选择是这样的:
Greatest(IFNULL(Salary_1 ,0), ...)
Least(
CASE WHEN Salary_1 IS NULL OR Salary_1 = 0 THEN /*some huge value*/ ELSE Salary_1 END
, CASE WHEN Salary_2
....)
这可能是最简单的逆透视和聚合数据:
select id, max(salary), min(salary)
from ((select id, salary_1 as salary from t) union all
(select id, salary_2 as salary from t) union all
. . .
) t
group by id;
这绝对比一个巨大的 case
表达式更昂贵。另一方面,它更不容易出错。
真正的建议是修复您的数据模型。尝试将数组存储在多列中通常是数据模型不佳的标志。更合适的方法是每个 salary
一行,而不是将它们放在单独的列中。
我有一个数据集,其中包含每个帐户的月薪支付行。我们有 6 列 -
Salary_1、Salary_2、Salary_3、Salary_4、Salary_5 和 Salary_6.
有时薪水 3、4、5、6 和偶尔 2 未填充,有时 none 填充是因为他们失业。在这种情况下,我们在字段中有 0。
我需要做的是合并所有薪水并从这些列中找到 MAX 和 MIN ---
Select
Greatest(Salary_1, Salary_2, Salary_3, Salary_4, Salary_5, Salary_6) as MaxSal,
Least(COALESCE(Salary_1, Salary_2, Salary_3, Salary_4, Salary_5, Salary_6),0) as MinSal
from
(select
sal1 as Salary_1, Select sal2 as Salary_2, Sal3 as Salary_3, sal4 as Salary_4, Sal5 as Salary_5, Sal6 as Salary_6
from ....)a
问题是,这为 Max Sal 返回了正确的值,但为 Min 返回了 0.00,因为它是最小值但不会让我忽略 0,但在这种情况下 0 不是最低工资值我想要,我需要这里的第二个最低值。
我已经尝试将原始的 Sal1-Sal6 值设置为 NULLIF 0,它 returns NULL 表示最大值,0 表示最小值。
我还能看什么? COALESCE 与 NULLIF 相结合对我不起作用,这是在之前的问题中推荐的。谢谢!
Greatest 和 Least 不会像聚合函数那样忽略空值;你需要做一些事情来避免它们。一种选择是这样的:
Greatest(IFNULL(Salary_1 ,0), ...)
Least(
CASE WHEN Salary_1 IS NULL OR Salary_1 = 0 THEN /*some huge value*/ ELSE Salary_1 END
, CASE WHEN Salary_2
....)
这可能是最简单的逆透视和聚合数据:
select id, max(salary), min(salary)
from ((select id, salary_1 as salary from t) union all
(select id, salary_2 as salary from t) union all
. . .
) t
group by id;
这绝对比一个巨大的 case
表达式更昂贵。另一方面,它更不容易出错。
真正的建议是修复您的数据模型。尝试将数组存储在多列中通常是数据模型不佳的标志。更合适的方法是每个 salary
一行,而不是将它们放在单独的列中。