如何在hive查询中编写case和group

pri*_*nka 7 hadoop hive hiveql

这是我的蜂巢表:

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
Run Code Online (Sandbox Code Playgroud)

我想查询此表以通过以下方式检索数据:

course   dept    status

btech     cse     fail
btech      it     pass
mba        hr     absent
mtech      cs     fail
Run Code Online (Sandbox Code Playgroud)

首先,它将检查status每个中的"失败"或"被扣留" deptcourse组合在一起.如果发现"失败"或"被扣留",它将输出"失败"作为status.否则,如果在同一组中发现"缺席",则将输出"缺席"作为status.否则,它将输出"通过".

我运行以下查询时收到错误消息:

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;
Run Code Online (Sandbox Code Playgroud)

小智 13

按课程和部门分组时,您将获得状态列的多个值(针对不同的记录),这需要进行处理.
select中不属于group by的任何列都应该在一个聚合函数中,
这是一个使用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
Run Code Online (Sandbox Code Playgroud)


Tho*_*aux 6

如果我理解正确的话,你想要这样的东西:

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;
Run Code Online (Sandbox Code Playgroud)

我在 GROUP 中使用 CASE,它与 Hive 配合得很好。