一、使用分析函數來爲記錄排名:
Rank,Dense_Rank,Row_Number
rank():主要用於排序,並給出序號。在排序後對相同的數據給予相同序號,接下來的序號直接跳躍
dense_rank():功能同rank()一樣,區別在於:在排序後對相同的數據給予相同序號,接下來的序號不跳躍
row_number():按照順序依次使用,相當於我們普通查詢裏的rownum值
另一種理解
①ROW_NUMBER:
Row_number函數返回一個唯一的值,當碰到相同數據時,排名按照記錄集中記錄的順序依次遞增。
②DENSE_RANK:
Dense_rank函數返回一個唯一的值,除非當碰到相同數據時,此時所有相同數據的排名都是一樣的。
③RANK:
Rank函數返回一個唯一的值,除非遇到相同的數據時,此時所有相同數據的排名是一樣的,同時會在最後一條相同記錄和下一條不同記錄的排名之間空出排名。
如:
1,2,2,4,5,6...這是rank()的形式
1,2,2,3,4,5...這是dense_rank()的形式
1,2,3,4,5,6...這是row_number()的形式
實例:
SQL> select deptno,ename,sal,
row_number() over ( order by sal desc ) row_num,
rank() over ( order by sal desc) rank,
dense_rank() over(order by sal desc) dense_rank
from emp;
DEPTNO ENAME SAL ROW_NUM RANK DENSE_RANK
------ ---------- --------- ---------- ---------- ----------
10 KING 5000.00 1 1 1
20 FORD 3000.00 2 2 2
20 SCOTT 3000.00 3 2 2
30 BLAKE 2850.00 4 4 3
10 CLARK 2450.00 5 5 4
20 JONES 2053.80 6 6 5
30 ALLEN 600.00 7 7 6
30 TURNER 1500.00 8 8 7
30 MARTIN 1250.00 9 9 8
30 WARD 250.00 10 9 8
10 MILLER 1114.59 11 11 9
20 ADAMS 1100.00 12 12 10
30 JAMES 950.00 13 13 11
20 SMITH 800.00 14 14 12
14 rows selected
二、使用分析函數爲記錄進行分組排名:
下面這條語句爲了查詢做分組排名的效果:
SQL> select deptno,ename,sal,(select count(*)+1 from emp b where b.deptno=a.deptno and b.sal>a.sal ) rownumber from emp a order by deptno,sal desc;
DEPTNO ENAME SAL ROWNUMBER
------ ---------- --------- ----------
10 KING 5000.00 1
10 CLARK 2450.00 2
10 MILLER 1114.59 3
20 SCOTT 3000.00 1
20 FORD 3000.00 1
20 JONES 2053.80 3
20 ADAMS 1100.00 4
20 SMITH 800.00 5
30 BLAKE 2850.00 1
30 ALLEN 1600.00 2
30 TURNER 1500.00 3
30 MARTIN 1250.00 4
30 WARD 1250.00 4
30 JAMES 950.00 6
14 rows selected
以下爲分析函數分組排名:
SQL> select deptno,ename,sal,
row_number() over (partition by deptno order by sal desc ) row_number,
rank() over (partition by deptno order by sal desc) rank,
dense_rank() over(partition by deptno order by sal desc) dense_rank
from emp order by deptno,sal desc;
DEPTNO ENAME SAL ROW_NUMBER RANK DENSE_RANK
------ ---------- --------- ---------- ---------- ----------
10 KING 5000.00 1 1 1
10 CLARK 2450.00 2 2 2
10 MILLER 1114.59 3 3 3
20 FORD 3000.00 1 1 1
20 SCOTT 3000.00 2 1 1
20 JONES 2053.80 3 3 2
20 ADAMS 1100.00 4 4 3
20 SMITH 800.00 5 5 4
30 BLAKE 2850.00 1 1 1
30 ALLEN 1600.00 2 2 2
30 TURNER 1500.00 3 3 3
30 MARTIN 1250.00 4 4 4
30 WARD 1250.00 5 4 4
30 JAMES 950.00 6 6 5
14 rows selected
三、使用rownum爲記錄排名:
SQL> select rownum,t.empno,t.ename,t.sal from (select * from emp order by sal desc) t where rownum<=12 order by t.sal desc;
ROWNUM EMPNO ENAME SAL
---------- ----- ---------- ---------
1 7839 KING 5000.00
2 7788 SCOTT 3000.00
3 7902 FORD 3000.00
4 7698 BLAKE 2850.00
5 7782 CLARK 2450.00
6 7566 JONES 2053.80
7 7499 ALLEN 1600.00
8 7844 TURNER 1500.00
9 7521 WARD 1250.00
10 7654 MARTIN 1250.00
11 7934 MILLER 1114.59
12 7876 ADAMS 1100.00
12 rows selected