如何从 Hive Hue 中的 7 列中获取最小值和最大值,不包括零
How to get min and max from 7 columns in Hive Hue excluding zeros
我有一个 table,它有 9 列。下面是它的结构
我需要这些列的最小值和最大值作为不包括零的行。下面是必需的 table 结构
如果您看到 min 和 max 列,min 是特定行中不包括零的 7 列(col1 到 col7)中的最小值,max 是该行 7 列(col1 到 col7)中的最大值。
请帮助我在 hive (hue) 中完成此操作。
您可以使用 least
和 greatest
获取最小值和最大值,并使用 when
删除 0
。
select *,
least(
case when col1 != 0 then col1 else 99999999 end,
case when col2 != 0 then col2 else 99999999 end,
case when col3 != 0 then col3 else 99999999 end,
case when col4 != 0 then col4 else 99999999 end,
case when col5 != 0 then col5 else 99999999 end,
case when col6 != 0 then col6 else 99999999 end,
case when col7 != 0 then col7 else 99999999 end,
) as `Min`
greatest(
case when col1 != 0 then col1 else -99999999 end,
case when col2 != 0 then col2 else -99999999 end,
case when col3 != 0 then col3 else -99999999 end,
case when col4 != 0 then col4 else -99999999 end,
case when col5 != 0 then col5 else -99999999 end,
case when col6 != 0 then col6 else -99999999 end,
case when col7 != 0 then col7 else -99999999 end
) as `Max`
from mytable
您可以使用显式 case
表达式:
select (case when col1 <> 0 and col1 >= col2 and col1 >= col3 and col1 > =col4 and col1 >= col5 and col1 >= col6 and col1 >= col7
then col1
. . .
end)
打字量很大。这可能表明您的数据存储不正确——您应该为每一列设置单独的行。您可以通过扩展数据并重新聚合来模仿这一点:
select name, state, col1, col2, col3, col4, col5, col6, col7,
min(case when col1 <> 0 then col1 end) as min_value,
max(case when col1 <> 0 then col1 end) as max_value,
from ((select t.*, col1 as col from t) union all
(select t.*, col2 as col from t) union all
(select t.*, col3 as col from t) union all
(select t.*, col4 as col from t) union all
(select t.*, col5 as col from t) union all
(select t.*, col6 as col from t) union all
(select t.*, col7 as col from t)
) x
group by name, state, col1, col2, col3, col4, col5, col6, col7;
我有一个 table,它有 9 列。下面是它的结构
我需要这些列的最小值和最大值作为不包括零的行。下面是必需的 table 结构
如果您看到 min 和 max 列,min 是特定行中不包括零的 7 列(col1 到 col7)中的最小值,max 是该行 7 列(col1 到 col7)中的最大值。
请帮助我在 hive (hue) 中完成此操作。
您可以使用 least
和 greatest
获取最小值和最大值,并使用 when
删除 0
。
select *,
least(
case when col1 != 0 then col1 else 99999999 end,
case when col2 != 0 then col2 else 99999999 end,
case when col3 != 0 then col3 else 99999999 end,
case when col4 != 0 then col4 else 99999999 end,
case when col5 != 0 then col5 else 99999999 end,
case when col6 != 0 then col6 else 99999999 end,
case when col7 != 0 then col7 else 99999999 end,
) as `Min`
greatest(
case when col1 != 0 then col1 else -99999999 end,
case when col2 != 0 then col2 else -99999999 end,
case when col3 != 0 then col3 else -99999999 end,
case when col4 != 0 then col4 else -99999999 end,
case when col5 != 0 then col5 else -99999999 end,
case when col6 != 0 then col6 else -99999999 end,
case when col7 != 0 then col7 else -99999999 end
) as `Max`
from mytable
您可以使用显式 case
表达式:
select (case when col1 <> 0 and col1 >= col2 and col1 >= col3 and col1 > =col4 and col1 >= col5 and col1 >= col6 and col1 >= col7
then col1
. . .
end)
打字量很大。这可能表明您的数据存储不正确——您应该为每一列设置单独的行。您可以通过扩展数据并重新聚合来模仿这一点:
select name, state, col1, col2, col3, col4, col5, col6, col7,
min(case when col1 <> 0 then col1 end) as min_value,
max(case when col1 <> 0 then col1 end) as max_value,
from ((select t.*, col1 as col from t) union all
(select t.*, col2 as col from t) union all
(select t.*, col3 as col from t) union all
(select t.*, col4 as col from t) union all
(select t.*, col5 as col from t) union all
(select t.*, col6 as col from t) union all
(select t.*, col7 as col from t)
) x
group by name, state, col1, col2, col3, col4, col5, col6, col7;