如何在Oracle中排名第一?

时间:2010-08-10 17:10:08

标签: sql oracle oracle11g greatest-n-per-group

如何执行以下操作?

select top 1 Fname from MyTbl

Oracle 11g

9 个答案:

答案 0 :(得分:227)

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

select fname from MyTbl where rownum = 1

您还可以使用分析函数进行排序并获取顶部x:

select max(fname) over (rank() order by some_factor) from MyTbl

答案 1 :(得分:146)

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

答案 2 :(得分:25)

使用Oracle 12c(2013年6月),您可以像以下一样使用它。

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

答案 3 :(得分:9)

您可以在子查询中使用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;

<强> RESULT

enter image description here

在某些情况下,我们需要选择与TOP N相对应的NAME个结果。在这种情况下,我们可以在子查询中使用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;

<强> RESULT

enter image description here

答案 4 :(得分:7)

您可以执行类似

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

您还可以使用分析功能 RANK 和/或 DENSE_RANK ,但 ROWNUM 可能是最简单的。

答案 5 :(得分:6)

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

答案 6 :(得分:5)

使用:

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

如果使用Oracle9i +,您可以查看using analytic functions like ROW_NUMBER() but they won't perform as well as ROWNUM

答案 7 :(得分:3)

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

第一

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)

答案 8 :(得分:2)

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

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

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

祝你好运