2009-11-04 4 views
6

Je sais que le titre ne semble pas très descriptif, mais il est le meilleur que je pouvais penser:multiples valeurs max dans une requête

J'ai ce tableau

 
ID  BDATE  VALUE 
28911 14/4/2009 44820 
28911 17/4/2009 32240 
28911 20/4/2009 30550 
28911 22/4/2009 4422587,5 
28911 23/4/2009 4441659 
28911 24/4/2009 7749594,67 
38537 17/4/2009 58280 
38537 20/4/2009 137240 
38537 22/4/2009 81098692 
38605 14/4/2009 2722368 
38605 20/4/2009 5600 
38605 22/4/2009 1625400 
38605 23/4/2009 6936575 

qui est en fait un très requête complexe encapsulée dans une vue, mais ce n'est pas le cas maintenant.

Je voudrais avoir pour chaque ID, la ligne contenant le BDate le plus élevé. Dans cet exemple, ce serait le résultat.

 
ID  BDATE  VALUE 
28911 24/4/2009 7749594,67 
38537 22/4/2009 81098692 
38605 23/4/2009 6936575 

J'ai déjà essayé

select id, max(bdate), value from myview group by id, value 

, mais il renvoie toutes les lignes, parce que pour chaque valeur collumn est différente. Cette requête est conçue dans Oracle v10 et je suis autorisé à utiliser uniquement des requêtes select et non à créer des procédures.

+0

Merci pour tous les répond les gars. – kurast

+0

diablo II - quais de kurast? – CheeseConQueso

+0

Oui, je m'appelle diablo II. les quais de kurast. Le mot Kurast lorsqu'il est prononcé me semble tellement génial, que je ne pouvais pas supporter de l'utiliser. – kurast

Répondre

10
select id, bdate, value 
from myview 
where (id, bdate) in 
    (select id, max(bdate) 
    from myview group by id) 
/
+0

Comment ajouteriez-vous une autre condition à cette requête - comme 'AND value> 500'? – kerosene

0
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 
+0

il ne retourne pas la valeur collumn, que je veux – kurast

+0

Correction de cela. Non testé, bien sûr. –

0
SELECT id, bdate, value FROM myview 
WHERE (id, bdate) IN (SELECT id, MAX(bdate) FROM myview GROUP BY id) 

(non testé ... Je n'ai pas Oracle disponible en ce moment ...)

2

Vous pouvez utiliser l'analyse:

select 
     id, bdate, value 
    from 
     (
     select 
      id, bdate, value, max(bdate) over (partition by id) max_bdate 
     from 
      myview 
    ) 
    where 
     bdate = max_bdate 
2

Vous pouvez utiliser un INNER JOIN pour filtrer uniquement les lignes maximum:

select t.* 
from YourTable t 
inner join (
    select id, max(bdate) as maxbdate 
    from YourTable 
    group by id 
) filter 
    on t.id = filter.id 
    and t.bdate = filter.maxbdate 

Cette impression:

id  bdate  value 
38605 2009-04-23 6936575 
38537 2009-04-22 81098692 
28911 2009-04-24 7749594.67 

Notez que cela renvoie plusieurs lignes pour un identifiant qui a des valeurs multiples avec le même bdate.

8

vous pouvez utiliser la MAX...KEEP(DENSE_RANK FIRST...) construction:

SQL> SELECT ID, 
    2   MAX(bdate) bdate, 
    3   MAX(VALUE) KEEP(DENSE_RANK FIRST ORDER BY bdate DESC) VALUE 
    4 FROM DATA 
    5 GROUP BY ID; 

     ID BDATE   VALUE 
---------- ----------- ---------- 
    28911 24/04/2009 7749594,67 
    38537 22/04/2009 81098692 
    38605 23/04/2009  6936575 

Ce sera aussi efficace que la méthode d'analyse proposée par Majkel (pas autojointure, un seul passage sur les données)

Questions connexes