简体   繁体   English

如何从 Hive 色调中的 7 列中获取最小值和最大值,不包括零

[英]How to get min and max from 7 columns in Hive Hue excluding zeros

I have a table which has 9 columns.我有一个有 9 列的表。 Below is the structure of it下面是它的结构

原始表结构

I need the min and max of these columns for a row excluding zeros.对于不包括零的行,我需要这些列的最小值和最大值。 Below is the required table structure下面是所需的表结构

需要输出

If you see the columns min and max, min is minimum of 7 cols (col1 to col7) in a particular row excluding zero and max is the maximum of the 7 cols (col1 to col7) for that row.如果您看到 min 和 max 列,min 是特定行中除零之外的 7 列(col1 到 col7)的最小值,max 是该行 7 列(col1 到 col7)中的最大值。

Please help me to accomplish this in hive (hue).请帮助我在 hive(色调)中完成此操作。

You can use least and greatest to get the min and max, and use when to remove 0 .您可以使用leastgreatest来获取最小值和最大值,并使用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

You can use an explicit case expression:您可以使用显式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)

This is a lot of typing.这是很多打字。 It probably suggests that your data is stored incorrectly -- you should have separate rows for each column.这可能表明您的数据存储不正确——您应该为每列设置单独的行。 You can mimic this by expanding the data and reaggrating:您可以通过扩展数据并重新聚合来模拟这一点:

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;
      

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM