Select Oracle 中的前两行

Select top two rows in Oracle

我试图只显示 Oracle 中的前两行,但是我无法找到任何有效的方法。

我目前有

SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE)
FROM BRANCH, SESSIONS
WHERE SESSIONS.BRANCHID = BRANCH.BRANCHID
GROUP BY BRANCHNAME, BRANCH.BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC

哪个returns这个

B2      A     18.67
B4      B     17.57
B3      C     15.44
B1      D     13.99

但是,我只想要这个table的前两行。

我到底该怎么做?

使用 RowNUM :

用于指定记录条数为return。

            SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE)
            FROM BRANCH, SESSIONS
            WHERE 
            ROWNUM <= 2 and SESSIONS.BRANCHID = BRANCH.BRANCHID
            GROUP BY BRANCHNAME, BRANCH.BRANCHID
            ORDER BY AVG(SESSIONPRICE) DESC ;

我重新编辑了答案:

SELECT *
FROM (SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE)
FROM BRANCH, SESSIONS
WHERE SESSIONS.BRANCHID = BRANCH.BRANCHID

GROUP BY BRANCHNAME, BRANCH.BRANCHID
ORDER BY AVG(SESSIONPRICE) DESC
)
WHERE ROWNUM <= 2;

从 Oracle 9i 开始,可以使用 RANK() 和 DENSE_RANK() 函数来确定 TOP N 行。示例:

Get the top 2 BRANCH using RANK()

SELECT ename, sal 
  FROM ( SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE) RANK() OVER (ORDER BY AVG(SESSIONPRICE) DESC) avg_rank
           FROM BRANCH) 
 WHERE avg_rank<= 2;

Get the top 2 BRANCH using DENSE_RANK()

SELECT ename, sal 
  FROM ( SELECT BRANCH.BRANCHID, BRANCHNAME, AVG(SESSIONPRICE) DENSE_RANK() OVER (ORDER BY AVG(SESSIONPRICE) DESC) avg_Dense_rank
           FROM BRANCH) 
 WHERE avg_Dense_rank<= 2;