Saya punya meja yang memiliki 9 kolom. Di bawah ini adalah strukturnya

Raw Table Structure

Saya perlu min dan maks kolom ini untuk baris yang tidak termasuk nol. Di bawah ini adalah struktur tabel yang diperlukan

Output Required

Jika Anda melihat kolom min dan maks, min minimal 7 cols (col1 ke col7) dalam baris tertentu tidak termasuk nol dan max adalah maksimum 7 cols (col1 ke col7) untuk baris itu.

Tolong bantu saya untuk mencapai ini di Hive (Hue).

0
KVHP 3 April 2021, 11:28

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan least dan greatest untuk mendapatkan min dan maks, dan gunakan when untuk menghapus 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
1
mck 4 April 2021, 11:45

Anda dapat menggunakan ekspresi eksplisit 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)

Ini banyak mengetik. Mungkin menyarankan bahwa data Anda disimpan secara tidak benar - Anda harus memiliki baris terpisah untuk setiap kolom. Anda dapat meniru ini dengan memperluas data dan memberikan kembali:

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;
      
0
Gordon Linoff 3 April 2021, 11:07