これは私の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
およびdept
のcourse
で「失敗」または「拘束」されているかどうかを確認します。 「失敗」または「拘束」が見つかった場合、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;
コースと学科ごとにグループ化すると、ステータス列に複数の値(異なるレコードを含む)が得られるため、これを処理する必要があります。
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
私が正しく理解していれば、次のようなものが必要です:
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で正常に動作します。
これを試して。
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;
問題は、グループごとに必要な列が最後にある必要があることです。変更されたクエリの下で、今すぐ動作するはずです。
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;