Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment écrire une requête SQL pour sélectionner des lignes avec une valeur maximale dans une colonne

Ce type d'exigence (où vous avez besoin du max ou du min d'une colonne, regroupés par une autre, mais vous avez besoin de toutes les données de la ligne max ou min) est à peu près ce que fonctions analytiques sont pour. J'ai utilisé row_number - si des égalités sont possibles, vous devez clarifier l'affectation (voir mon commentaire sous votre question), et selon les détails, une autre fonction analytique peut être plus appropriée - peut-être rank() .

with
     my_table ( id, name, ref, dt, frm ) as (
       select 10, 'Ant' , 100, date '2017-02-02', 'David' from dual union all
       select 10, 'Ant' , 300, date '2016-01-01', 'David' from dual union all
       select  2, 'Cat' ,  90, date '2017-09-09', 'David' from dual union all
       select  2, 'Cat' , 500, date '2016-02-03', 'David' from dual union all
       select  3, 'Bird', 150, date '2017-06-28', 'David' from dual
     )
-- End of simulated table (for testing purposes only, not part of the solution).
-- SQL query begins BELOW THIS LINE.
select   id, name, ref, dt, frm
from     (
           select id, name, ref, dt, frm,
                  row_number() over (partition by id order by ref desc, dt desc) as rn
           from   my_table
         )
where    rn = 1
order by dt desc
;

ID  NAME  REF  DT          FRM 
--  ----  ---  ----------  -----
 3  Bird  150  2017-06-28  David
 2  Cat   500  2016-02-03  David
10  Ant   300  2016-01-01  David