您没有提及您使用的 Oracle 数据库版本;最终的“答案”取决于它,因为并非所有版本都支持我们答案中提供的所有功能。
这是适用于 Oracle 11g 及更高版本的一个。
我没有你的桌子,但是 - 同样,在 Scott 的 EMP 上。查看 3 个分析函数(以及 ROWNUM 伪列)返回什么:
SQL> select ename, sal,
2 rownum row_num,
3 rnk_1,
4 rnk_2,
5 rnk_3
6 from (select ename,
7 sal,
8 row_number() over (order by sal desc) rnk_1,
9 rank() over (order by sal desc) rnk_2,
10 dense_rank() over (order by sal desc) rnk_3
11 from emp
12 order by sal desc
13 )
14 order by sal desc;
ENAME SAL ROW_NUM RNK_1 RNK_2 RNK_3
---------- ---------- ---------- ---------- ---------- ----------
KING 10000 1 1 1 1
FORD 3000 2 2 2 2
SCOTT 3000 3 3 2 2
JONES 2975 4 4 4 3
BLAKE 2850 5 5 5 4
CLARK 2450 6 6 6 5
ALLEN 1600 7 7 7 6
TURNER 1500 8 8 8 7
MILLER 1300 9 9 9 8
WARD 1250 10 10 10 9
MARTIN 1250 11 11 10 9
ADAMS 1100 12 12 12 10
JAMES 950 13 13 13 11
SMITH 920 14 14 14 12
14 rows selected.
SQL>
注意RNK_3,它关心关系(两个或更多员工的薪水相同)。确定最适合您需求的版本后,请执行以下操作:
SQL> select ename,
2 sal,
3 rnk_3
4 from (select ename,
5 sal,
6 dense_rank() over (order by sal desc) rnk_3
7 from emp
8 )
9 where rnk_3 <= 5
10 order by rnk_3;
ENAME SAL RNK_3
---------- ---------- ----------
KING 10000 1
SCOTT 3000 2
FORD 3000 2
JONES 2975 3
BLAKE 2850 4
CLARK 2450 5
6 rows selected.
SQL>
在你的情况下,那将是
select product_name,
order_total,
rnk
from (select product_name,
order_total,
dense_rank() over (order by order_total desc) rnk
from product_summary
)
where rnk <= 5
order by order_total desc;