web-dev-qa-db-fra.com

comment écrire cas et groupe par requête Hive

Ceci est ma table 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

Je veux interroger cette table pour récupérer des données de la manière suivante:

course   dept    status

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

Premièrement, il recherchera "échec" ou "détenu" dans la status de chaque dept et course groupés ensemble. S'il trouve "échec" ou "retenu", il affichera "échec" sous la forme status. Sinon, si un "absent" est trouvé dans le même groupe, il produira "absent" en tant que status. Sinon, le résultat sera "pass".

J'ai reçu un message d'erreur lorsque j'ai exécuté la requête suivante:

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

Lorsque vous regroupez par cours et par département, vous obtenez plusieurs valeurs (provenant de différents enregistrements) pour la colonne de statut.
Toute colonne de la sélection qui ne fait pas partie du groupe doit se trouver dans une fonction d'agrégation 
voici une solution utilisant la fonction 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
9
b1n0ys

Si j'ai bien compris, vous voulez quelque chose comme:

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;

J'utilise CASE dans GROUP et cela fonctionne bien avec Hive.

3
Thomas Decaux

Essaye ça.

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

Le problème est que les colonnes requises pour grouper par doivent être à la fin. Sous la requête modifiée, cela devrait fonctionner maintenant.

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