Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie man eine SQL-Abfrage schreibt, um Zeilen mit dem maximalen Wert in einer Spalte auszuwählen

Diese Art von Anforderung (bei der Sie das Maximum oder Minimum nach einer Spalte benötigen, gruppiert nach einer anderen, aber Sie benötigen alle Daten aus der Max- oder Min-Zeile) ist so ziemlich das, was Analysefunktionen sind sind für. Ich habe row_number verwendet - wenn Unentschieden möglich sind, müssen Sie die Zuordnung klären (siehe meinen Kommentar unter Ihrer Frage), und je nach Details ist möglicherweise eine andere Analysefunktion geeigneter - vielleicht 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