我如何在Oracle中做第一名?

我如何做到以下几点?

select top 1 Fname from MyTbl 

在Oracle 11g中 ?

如果您只需要第一个选定的行,您可以:

 select fname from MyTbl where rownum = 1 

您也可以使用分析函数来sorting并取顶部的x:

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

使用Oracle 12c (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

在这里输入图像说明

如果您只需要取前两个date而不考虑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; 

结果

在这里输入图像说明

在某些情况下,我们需要select各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; 

结果

在这里输入图像说明

你可以做类似的事情

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

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

使用:

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

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

 select * from ( select FName from MyTbl ) where rownumn <= 1; 

要从表中select第一行并从表中select一行是两个不同的任务,并且需要不同的查询。 有很多可能的方法来做到这一点。 其中四个是:

第一

 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) 

我有同样的问题,我可以解决这个解决scheme:

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

您可以先订购您的结果,然后将第一个值放在上面。

祝你好运