Je sais que le titre ne sonne pas très descriptif, mais c'est le meilleur que je pouvais penser:
J'ai cette table p> qui est en fait un Une requête très compliquée encapsulée dans une vue, mais ce n'est pas de la matière maintenant. P> J'aimerais avoir pour chaque identifiant, la ligne contenant le bdate le plus élevé. Dans cet exemple, ce serait le résultat. p> J'ai déjà essayé p> mais puis il renvoie toutes les lignes, car pour chacune de la valeur de la valeur de la valeur de la valeur est différente . Cette requête est conçue dans Oracle V10 et je suis éligible uniquement à utiliser uniquement les requêtes et à ne pas créer de procédures. P> p>
6 Réponses :
select a.* from myview a, (select id, max(bdate) from myview group by id) b where a.id = b.id and a.bdate = b.bdate
Il ne renvoie pas la colonne de valeur que je veux
SELECT id, bdate, value FROM myview WHERE (id, bdate) IN (SELECT id, MAX(bdate) FROM myview GROUP BY id) (untested... I don't have Oracle available right now...)
Vous pouvez utiliser Analytics:
select id, bdate, value from ( select id, bdate, value, max( bdate ) over ( partition by id ) max_bdate from myview ) where bdate = max_bdate
Nous pouvons utiliser multiplier des colonnes dans une clause dans la clause:
Comment ajouteriez-vous une autre condition à cette requête - comme 'et la valeur> 500'?
Vous pouvez utiliser une jointure interne pour filtrer uniquement les lignes maximales: Ceci imprime: p> Notez que cela va Renvoie plusieurs lignes pour un identifiant qui a plusieurs valeurs avec le même bdate. p> p>
Vous pouvez utiliser le Ceci sera aussi efficace que la méthode analytique suggérée par Majkel (non auto-join, un seul passage sur le Données) p> p> max ... garder (dense_rank premier ...) code>
construction: