如何在 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 的方法~ 谢谢