wake-up-neo.com

wie man case und group by in Hive-Abfrage schreibt

Das ist meine Hive-Tabelle:

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

Ich möchte diese Tabelle abfragen, um Daten auf folgende Weise abzurufen:

course   dept    status

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

Zuerst wird in der status der jeweils zusammengestellten dept und course nach "fail" oder "inhaftiert" gesucht. Wenn es "Fail" oder "Inhaftiert" findet, gibt es "Fail" als status aus. Andernfalls wird ein "abwesend" in derselben Gruppe als "status" ausgegeben. Sonst wird "pass" ausgegeben.

Bei der folgenden Abfrage wurde eine Fehlermeldung angezeigt:

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;
3
priyanka

Wenn Sie nach Kurs und Abteilung gruppieren, erhalten Sie für die Statusspalte mehrere Werte (die für verschiedene Datensätze kommen), diese müssen behandelt werden.
Jede Spalte in select, die nicht zu group by gehört, sollte sich in einer Aggregatfunktion befinden 
Hier ist eine Lösung, die die Funktion sum () verwendet.

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
9
b1n0ys

Wenn ich es richtig verstanden habe, willst du so etwas wie:

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;

Ich verwende CASE in GROUP und es funktioniert gut mit Hive.

3
Thomas Decaux

Versuche dies.

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;
1
Lokesh

Das Problem ist, dass die Spalten, die für group by benötigt werden, am Ende sein müssen. Unter der modifizierten Abfrage sollte es jetzt funktionieren.

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