2017-06-08 5 views
0

Es gibt eine klare Antwort how to select top 1:Wie wählt man Top 1 und nach Datum in Oracle SQL sortiert?

select * from table_name where rownum = 1 

und wie nach Datum bestellen in absteigender Reihenfolge:

select * from table_name order by trans_date desc 

aber sie funktioniert nicht togeather (rownum nach nicht erzeugt wird, auf trans_date):

... where rownum = 1 order by trans_date desc 

Die Frage ist, wie Top 1 auch ord zu wählen nach Datum?

+0

@ MT0, ist dies nicht ein Duplikat ** "Wie kann ich tun top 1 in Oracle?" ** und **“ Oracle SELECT TOP 10 Datensätze "**, weil sie nur eine begrenzte Anzahl von Zeilen im Ergebnis einer Abfrage sind, und nicht über die Bestellung. Wie Sie sehen können, beziehe ich mich auf die erste Frage in meiner ersten Zeile. –

+0

"Wie führe ich Top 1 in Oracle?" Alle Antworten, abgesehen von der akzeptierten, zeigen, wie man die Ergebnismenge anordnet und das erste Ergebnis erhält. "Oracle SELECT TOP 10 Datensätze" fragt das OP explizit, warum sie zufällige Zeilen und nicht die obersten geordneten Zeilen erhalten. Sie sind Duplikate. – MT0

+0

BTW, ich kann die Frage nicht löschen, weil es vom System verboten ist: einige Leute haben es bereits beantwortet –

Antwort

4
... where rownum = 1 order by trans_date desc 

Diese willkürlich gewählte einen Datensatz auswählt (where rownum = 1) und sortiert dann diese einen Datensatz (order by trans_date desc).

Wie von Ivan gezeigt, können Sie eine Unterabfrage verwenden, wo Sie die Datensätze bestellen und dann den ersten Datensatz mit where rownum = 1 in der äußeren Abfrage behalten. Dies ist jedoch extrem Oracle-spezifisch und verletzt den SQL-Standard, bei dem ein Unterabfrageergebnis als ungeordnet betrachtet wird (d. H. Die Order-by-Klausel kann vom DBMS ignoriert werden).

Also besser mit der Standardlösung gehen. Ab Oracle 12c:

select * 
from table_name 
order by trans_date desc 
fetch first 1 row only; 

In älteren Versionen:

select * 
from 
(
    select t.*, row_number() over (order by trans_date desc) as rn 
    from table_name t 
) 
where rn = 1; 
0

sollte subquery sein, so rownum & order die Kombination funktionieren könnte:

select * from (select * from table_name order by trans_date desc) AS tb where rownum = 1 
0

Sie Fensterfunktionen für das verwenden können:

select t.* 
from (
    select *, 
     min(trans_date) over() as min_date, 
     max(trans_date) over() as max_date 
    from the_table 
) t 
where trans_date = min_date 
    or trans_date = max_date; 

Eine weitere Option auf der abgeleiteten Tabelle zu verbinden wäre

select t1.* 
from the_table 
    join ( 
    select min(trans_date) over() as min_date, 
      max(trans_date) over() as max_date 
    from the_table 
) t2 on t1.trans_date = t2.min_date 
    or t1.trans_date = t2.max_date; 

Nicht sicher, welcher wäre schnell äh, müssen Sie den Ausführungsplan

0

Moderne Oracle Versionen FETCH FIRST haben überprüfen:

select * from table_name order by trans_date desc 
fetch first 1 row only