通常上top N 的实现应该采用row_number() over 而不是rank因为row_number 是给记录加一个序号标记,而rank是相当于进行排序后的排名,也就是如果排序列是相同的,那么他们的返回值也是相同的,但row_number则一个序号标记而不是返回相同值
SQL> select a.* from a;
ID ENTERDATE TIMES
---------- -------------------- ----------
10 01-1月 -09 3
11 02-1月 -09 0
12 03-1月 -09 0
13 04-1月 -09 0
14 05-1月 -09 2
15 06-1月 -09 0
16 07-1月 -09 0
17 08-1月 -09 0
18 09-1月 -09 0
19 10-1月 -09 0
20 11-1月 -09 6
21 12-1月 -09 0
22 13-1月 -09 0
23 14-1月 -09 0
24 15-1月 -09 0
25 16-1月 -09 0
26 17-1月 -09 0
27 18-1月 -09 0
18 rows selected
SQL>select a.*,rank() over(order by times) rank,row_number() over(order by times) row_number from a;
ID ENTERDATE TIMES RANK ROW_NUMBER
---------- -------------------- ---------- ---------- ----------
11 02-1月 -09 0 1 1
26 17-1月 -09 0 1 2
25 16-1月 -09 0 1 3
27 18-1月 -09 0 1 4
12 03-1月 -09 0 1 5
13 04-1月 -09 0 1 6
15 06-1月 -09 0 1 7
16 07-1月 -09 0 1 8
17 08-1月 -09 0 1 9
18 09-1月 -09 0 1 10
19 10-1月 -09 0 1 11
21 12-1月 -09 0 1 12
22 13-1月 -09 0 1 13
23 14-1月 -09 0 1 14
24 15-1月 -09 0 1 15
14 05-1月 -09 2 16 16
10 01-1月 -09 3 17 17
20 11-1月 -09 6 18 18
18 rows selected
SQL>