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
在以当前行为基准,两个数字的范围内