2017-03-23 6 views
0

J'ai une table appelée prêt avec montant du prêt, revenu annuel, année (format MMM-YY) et ID de membre. J'essaie de trouver le montant du prêt le plus élevé dans une année avec le revenu annuel et les détails d'identification de membre.en utilisant alias pour lancer dans HIVE

J'ai essayé de groupe le montant du prêt le plus élevé par année en utilisant le code

select max(cast(loan_amt as int)),issue_d from loan group by issue_d; 

je voulais aussi aller chercher l'identifiant de membre et de l'information sur le revenu annuel j'ai donc écrit le code suivant

mais il est me donner un message d'erreur pour l'utilisation de l'alias pour une colonne qui est cast.

code:

select a.loan_amt,a.member_id,a.annual_inc,a.issue_d 
from 
(select loan_amt,member_id,annual_inc,issue_d from loan) a 
join 
(select max(cast(loan_amt as int)) as ml,issue_d from loan group by issue_d) c 
where ((a.issue_d=c.issue_d) and (a.loan_amt=a.ml)); 
+0

est votre code réellement utiliser sur place d'où et c.ml dans la deuxième j oin état? –

+0

Vous demandez de corriger techniquement une mauvaise solution au lieu de demander une bonne solution. –

+0

P.s. MMM-YY est un mauvais design et loan_amt doit être lancé. –

Répondre

0

Qu'est-ce que vous voulez faire est rang les dossiers en fonction du montant, par période, puis ne garder que le top 1 enregistrement pour chaque période.
Utilisez l'un des analytic functions conçus à cet effet - Hive a une très bonne prise en charge de la norme SQL sur ce sujet.

Puisque vous ne dites pas quoi faire des liens (ce que si plusieurs prêts ont le même montant ???) Je suppose que vous voulez juste un enregistrement choisi au hasard ...

select X, Y, Z, Period, Amount as TopAmount 
from 
(select X, Y, Z, Period, cast(StrAmt as double) as Amount, 
    row_number() over (partition by Period order by cast(StrAmt as double) desc) as TmpRank 
    from WTF 
) TMPWTF 
where TmpRank =1 

Si vous voulez tous les enregistrements avec le dessus Montant puis remplacer row_number avec rank ou dense_rank (la substance « dense » ferait une différence pour les 2 premiers, mais pas pour le top 1)