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

新手上路,请多包涵

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

 select * from table_name where rownum = 1

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

 select * from table_name order by trans_date desc

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

 ... where rownum = 1 order by trans_date desc

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

原文由 Ivan Gerasimenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 605
2 个回答
... where rownum = 1 order by trans_date desc

这会选择任意选择的一条记录( 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;

在旧版本中:

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

原文由 Thorsten Kettner 发布,翻译遵循 CC BY-SA 3.0 许可协议

现代 Oracle 版本具有 FETCH FIRST

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

原文由 jarlh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进