2012-08-03 5 views
4

J'ai données au format suivantOracle requête SQL: comment utiliser le nombre

userid amount term APR 
1  10  5 1 
1  10  4 2 
2  20  6 1 
2  20  4 3 
2  20  3 1 

que je veux faire pour par le montant, la durée, APR donc de la production, je veux montant maximum et il est terme correspondant, avril Dans le cas où le montant est le même, choisissez-en un avec le terme maximum et même chose si le terme est également le même. mais la combinaison de ces trois est toujours unique.

colonnes de sortie:

userid, amount, term, apr, numberOfRowsForEachUser 
    1  10  5 1  2 
    2  20  6 1  3 

Question: Je suis en mesure d'obtenir les quatre premières colonnes, mais ne savez pas comment obtenir « Nombre total d'offres » ou «nombre total de lignes par utilisateur.

Ma requête ressemble à ceci.

select 
    userid,amount,term,apr 
    from 
(select userid, amount, term, apr 
    RANK() OVER (PARTITION BY userid ORDER BY amount,term,apr) amount_rank, 
from 
    tableXYZ 
) 
where amount_rank = 1 

Répondre

5

il suffit d'ajouter une fonction analytique COUNT(*)

select 
    userid,amount,term,apr, cnt 
    from 
(select userid, amount, term, apr 
    RANK() OVER (PARTITION BY userid ORDER BY amount,term,apr) amount_rank, 
    COUNT(*) OVER (PARTITION BY userid) cnt 
from 
    tableXYZ 
) 
where amount_rank = 1 
2

J'ai aimé réponse Justing (+1) mais toujours voulu fournir une autre réponse qui me est plus intuitive:

select x.userid,x.amount,x.term,x.apr,y.cnt 
from tableXYZ x, (select userid, COUNT(1) cnt from tableXYZ group by userid) y 
where x.term = (select max(term) from tableXYZ xx where xx.userid = x.userid) 
and x.userid = y.userid 

Vous pouvez jouer avec elle here