web-dev-qa-db-ja.com

Hiveクエリでケースとグループ化を記述する方法

これは私のHiveテーブルです。

course   dept    subject   status

btech     cse     Java     pass
btech     cse     hadoop   fail
btech     cse     cg       detained
btech     cse     cc       pass
btech      it     daa      pass
btech      it     wt       pass
btech      it     cnn      pass
mba        hr     hrlaw    pass
mba        hr     hrguid   absent
mtech      cs     Java     pass
mtech      cs     cd       pass
mtech      cs     cp       detained

このテーブルをクエリして、次の方法でデータを取得します。

course   dept    status

btech     cse     fail
btech      it     pass
mba        hr     absent
mtech      cs     fail

最初に、グループ化された各statusおよびdeptcourseで「失敗」または「拘束」されているかどうかを確認します。 「失敗」または「拘束」が見つかった場合、statusとして「失敗」を出力します。それ以外の場合、同じグループに「不在」が見つかった場合、statusとして「不在」が出力されます。それ以外の場合、「pass」を出力します。

次のクエリを実行すると、エラーメッセージが表示されました。

select course,dept,
case 
when status in ( 'fail','detained') then 'fail'
when status in ( 'absent') then 'absent'
when status in ( 'pass') then 'pass'
else null 
end as Final_Status
from college
group by course,dept;
7
priyanka

コースと学科ごとにグループ化すると、ステータス列に複数の値(異なるレコードを含む)が得られるため、これを処理する必要があります。
group byの一部ではないselectの列は、集計関数内にある必要があります
これはsum()関数を使用したソリューションです。

select course, dept,
    case when sum(case when status in ( 'fail','detained') then 1 else 0 end) > 0 then 'fail'
         when sum(case when status in ('absent') then 1 else 0 end) > 0 then 'absent'
         when sum(case when status in ('pass') then 1 else 0 end) > 0 then 'pass'
         else 'no_result'
    end as final_status
from college
group by 
    course,dept
13
b1n0ys

私が正しく理解していれば、次のようなものが必要です:

select course,dept,
case 
when status in ( 'fail','detained') then 'FAILED'
when status in ( 'absent') then 'absent'
when status in ( 'pass') then 'PASSED'
else null 
end as Final_Status
from college
group by course,dept, 
   CASE when status in ( 'fail','detained') then 'FAILED'
   when status in ( 'absent') then 'absent'
   when status in ( 'pass') then 'PASSED'
   else null END;

GROUPでCASEを使用していますが、Hiveで正常に動作します。

3
Thomas Decaux

これを試して。

select course,dept,
collect_set(
case 
when status in ( 'fail','detained') then 'FAILED'
when status in ( 'absent') then 'absent'
when status in ( 'pass') then 'PASSED'
else null 
end ) as Final_Status
from college
group by course,dept;
2
Lokesh

問題は、グループごとに必要な列が最後にある必要があることです。変更されたクエリの下で、今すぐ動作するはずです。

select 
case 
when status in ( 'fail','detained') then 'FAILED'
when status in ( 'absent') then 'absent'
when status in ( 'pass') then 'PASSED'
else null 
end as Final_Status,course,dept
from college
group by course,dept;
0
BalaramRaju