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
有时候我们想自动的计算所列的字段的增加数,确定要查询的在哪一位置
就要用到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
相关文章推荐
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number)
- ORACLE分析函数(3)---rank,dense_rank,row_number
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 【转】
- oracle分析函数系列之rank,dense_rank,row_number:实现排名策略
- oracle分析函数Rank, Dense_rank, row_number
- oracle分析函数Rank, Dense_rank, row_number
- [zt] Oracle 10g 统计信息自动收集功能(automatic statistics gathering)
- Oracle分析函数之Rank()和DENSE_RANK()详解
- SQLServer2005新增序列功能的几个函数:ROW_NUMBER, RANK, DENSE_RANK, and NTILE
- Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
- Oracle-分析函数之排序值rank()和dense_rank()
- Oracle rank和dense_rank排名函数
- Oracle rank和dense_rank排名函数
- oracle分析函数Rank, Dense_rank, row_number
- Oracle分析函数-keep(dense_rank first/last)
- Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
- 排名函数(ROW_NUMBER、RANK、DENSE_RANK)及OVER子句 Oracle 中分析函数用法之--rank(),dense_rank(),partition,over()
- Oracle分析函数(2) keep(dense_rank first/last) FIRST_VALUE() LAST_VALUE()
- oracle over rank dense_rank row_number 等分析函数总结
- Oracle分析函数RANK(),DENSE_RANK(),ROW_NUMBER()的用法