DENSE_RANK(),RANK()區別
說明:DENSE_RANK(),RANK()是oracle自帶的分析函數,經常被用於在分組後的組內對某一字段的建立序列的方法,它們的區別在於相同字段值的處理不同
範例:
select deptno,cname,sal,
dense_rank()
over (partition by deptno
order by sal desc) dr,
rank()
over (partition by deptno
order by sal desc) r
from emp
order by deptno,sal desc
/
結果:
DEPTNO ENAME SAL DR R
---------- ---------- ---------- ---------- ----------
10 KING 5000 1 1
10 CLARK 2450 2 2
10 MILLER 1300 3 3
20 SCOTT 3000 1 1
20 FORD 3000 1 1
20 JONES 2975 2 3
20 ADAMS 1100 3 4
30 BLAKE 2850 1 1
30 TURNER 1500 2 2
30 WARD 1250 3 3
30 MARTIN 1250 3 3
30 JAMES 950 4 5
30 ALLEN 600 5 6
分析函數中WINDOWS子句
RANGE
分析的字段必須是日期或數字型,根據當前分析行值進行比較、運算
ROWS
字段可以是任意類型,是行的物理數
WINDOWS子句中的sepcific 字句
UNBOUNDED PRECEDING
排序後從當前分區的第一行開始,結束與正在處理的當前行
CURRENT ROW
從當前行開始(並結束)
NUMERIC EXPRESSION PRECEDING
排序後從當前行之前的數字表達式開始
NUMERIC EXPRESSION FOLLOWING
排序後從當前行直到當前行之後的數字表達式結束
BETWEEN NUMERIC EXPRESSION1 AND NUMERIC EXPRESSION2 FOLLOWING
在以當前行爲基準,兩個數字的範圍內