如何在Oracle SQL中选择前1和按日期排序?

Iva*_*nko 4 sql oracle

有一个明确的答案如何选择前1:

select * from table_name where rownum = 1
Run Code Online (Sandbox Code Playgroud)

以及如何按日期降序排序:

select * from table_name order by trans_date desc
Run Code Online (Sandbox Code Playgroud)

但它们不起作用(rownum不是根据trans_date)生成的:

... where rownum = 1 order by trans_date desc
Run Code Online (Sandbox Code Playgroud)

问题是如何选择按日期排序的前1名?

Tho*_*ner 21

... where rownum = 1 order by trans_date desc
Run Code Online (Sandbox Code Playgroud)

这将选择一个任意选择的记录(where rownum = 1),然后对这一个记录(order by trans_date desc)进行排序.

如Ivan所示,您可以使用子查询来订购记录,然后where rownum = 1在外部查询中保留第一条记录.但是,这是特定于Oracle的,并且违反了SQL标准,其中子查询结果被认为是无序的(即DBMS可以忽略order by子句).

所以最好采用标准解决方案.从Oracle 12c开始:

select * 
from table_name 
order by trans_date desc
fetch first 1 row only;
Run Code Online (Sandbox Code Playgroud)

在旧版本中:

select *
from
(
  select t.*, row_number() over (order by trans_date desc) as rn
  from table_name t
)
where rn = 1;
Run Code Online (Sandbox Code Playgroud)


jar*_*rlh 6

现代 Oracle 版本有FETCH FIRST

select * from table_name order by trans_date desc
fetch first 1 row only
Run Code Online (Sandbox Code Playgroud)