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

Posted

技术标签:

【中文标题】如何在 Oracle SQL 中选择前 1 名并按日期排序? [复制]【英文标题】:How to select top 1 and ordered by date in Oracle SQL? [duplicate] 【发布时间】:2017-11-09 20:56:28 【问题描述】:

有明确的答案how to select 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

问题是如何选择top 1也按日期排序?

【问题讨论】:

@MT0 ,这不是 "How do I do top 1 in Oracle?""Oracle SELECT TOP 10 records" 的重复项因为它们只是查询结果中的有限行数,而不是关于排序。如您所见,我指的是我的第一行中的第一个问题。 "如何在 Oracle 中排名第一?"除了接受的答案之外,所有答案都显示了如何对结果集进行排序并获得第一个排序结果。 “Oracle SELECT TOP 10 记录” OP 明确询问为什么他们得到随机行而不是排序最高的行。它们是重复的。 顺便说一句,我不能删除问题,因为它被系统禁止:有些人已经回答了它 这个答案最好。 【参考方案1】:

应该有子查询,这样rownum & order 的组合才能起作用:

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

【讨论】:

【参考方案2】:

您可以为此使用窗口函数:

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;

另一种选择是加入派生表

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;

不确定哪个会更快,需要检查执行计划

【讨论】:

【参考方案3】:

现代 Oracle 版本有FETCH FIRST:

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

【讨论】:

【参考方案4】:
... 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;

【讨论】:

这将返回最少的元素,与 OP 想要的相反 @user1102532:不。我按日期降序对行进行排序,这首先给了我最近的日期。因此,我保留了最大日期的行。

以上是关于如何在 Oracle SQL 中选择前 1 名并按日期排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL SEVER 查询结果中,选择前10条记录,或者前10%的记录,等等,不要ACCESS,OR ORACLE 的方法~ 谢谢

如何从 T-SQL 中的表中选择前 N 行?

Oracle SQL - 如何在没有 PL/SQL 的情况下检查合同的延续

猪 - 获得前 n 名并在“其他”中分组休息

SQL如何查询一张表的所有字段并按其中一个字段进行分组

使用变量作为表名并传递给另一个 sql 查询 [重复]