如何在Oracle中做top 1 ?

我该怎么做呢?

select top 1 Fname from MyTbl

Oracle 11 g吗?

814455 次浏览

如果你只想要第一个被选中的行,你可以:

select fname from MyTbl where rownum = 1

你也可以用解析函数来排序,取最上面的x:

select max(fname) over (rank() order by some_factor) from MyTbl
select * from (
select FName from MyTbl
)
where rownum <= 1;
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;

使用:

SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1

如果使用Oracle9i+,你可以查看使用像ROW_NUMBER()这样的分析函数,但它们的性能不如ROWNUM

我也遇到过同样的问题,我可以用这个解决方案来解决这个问题:

select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1

您可以将结果排序,使第一个值在上面。

祝你好运

你可以这样做

    SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;

你也可以使用解析函数排名和/或DENSE_RANK,但ROWNUM可能是最简单的。

从表中选择第一行和从表中选择一行是两个不同的任务,需要不同的查询。有许多可能的方法可以做到这一点。其中四个是:

第一个

select  max(Fname) from MyTbl;

第二个

select  min(Fname) from MyTbl;

第三

select  Fname from MyTbl  where rownum = 1;

第四

select  max(Fname) from MyTbl where rowid=(select  max(rowid) from MyTbl)

使用甲骨文12 c(2013年6月),你可以像下面这样使用它。

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

你可以在子查询中使用ROW_NUMBER()ORDER BY子句,并使用此列替换TOP N。这可以逐步解释。

参见下面的表格,其中有两列NAMEDT_CREATED

enter image description here

如果你只需要取前两个日期而不考虑NAME,你可以使用下面的查询。逻辑已经在查询中编写

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
-- Generates numbers in a column in sequence in the order of date
SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;

结果

enter image description here

在某些情况下,我们需要分别为每个NAME选择TOP N结果。在这种情况下,我们可以在子查询中使用PARTITION BYORDER BY子句。参考下面的查询。

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
--Generates numbers in a column in sequence in the order of date for each NAME
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;

结果

enter image description here