您的位置:首页 > 数据库 > Oracle

oracle日积月累[ZT]-浅析自动连续数或者按目的取数函数RANK(),DENSE_RANK()功能

2005-01-24 13:48 701 查看
浅析自动连续数或者按目的取数函数RANK(),DENSE_RANK()功能

有时候我们想自动的计算所列的字段的增加数,确定要查询的在哪一位置
就要用到rank(),或者DENSE_rank()函数,下面用例子说明一下,不正之处大家指正

表EMP有字段DEPTNO,ENAME,SAL,下面是不排除相同数的SEQUENTIAL ORDER

SELECT deptno,
ename,
sal,
rank() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM emp
WHERE deptno = 30;
显示结果如下:
DEPTNO ENAME SAL rank
---------- ---------- ---------- ----------
30 JAMES 950 1
30 WARD 1250 2
30 MARTIN 1250 2
30 TURNER 1500 4
30 ALLEN 1600 5
30 BLAKE 2850 6

如果我要的是相同的就算为一个连续数字怎么办??
SELECT deptno,
ename,
sal,
DENSE_rank() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM emp
WHERE deptno = 30;

那么结果会如下
DEPTNO ENAME SAL rank
---------- ---------- ---------- ----------
30 JAMES 950 1
30 WARD 1250 2
30 MARTIN 1250 2
30 TURNER 1500 3
30 ALLEN 1600 4
30 BLAKE 2850 5

有时候我们需要的是确定一大组数的最小或最大或平均或其他要求
就用以下方法:
SELECT deptno,
ename,
sal,
MIN(sal) KEEP (DENSE_rank FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest",
MAX(sal) KEEP (DENSE_rank LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest"
FROM emp
ORDER BY deptno, sal;

结果如下:
DEPTNO ENAME SAL Lowest Highest
---------- ---------- ---------- ---------- ----------
10 MILLER 1300 1300 5000
10 CLARK 2450 1300 5000
10 KING 5000 1300 5000
20 SMITH 800 800 3000
20 ADAMS 1100 800 3000
20 JONES 2975 800 3000
20 SCOTT 3000 800 3000
20 FORD 3000 800 3000
30 JAMES 950 950 2850
30 WARD 1250 950 2850
30 MARTIN 1250 950 2850

DEPTNO ENAME SAL Lowest Highest
---------- ---------- ---------- ---------- ----------
30 TURNER 1500 950 2850
30 ALLEN 1600 950 2850
30 BLAKE 2850 950 2850
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: