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;
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
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.
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;
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;