当前位置:数据库 > Oracle >>

oracle统计函数学习

oracle统计函数学习
 
数据库准备
Java代码  
CREATE TABLE emp (  
  deptno int NOT NULL,  
  ename varchar(100) DEFAULT NULL,  
  sal int DEFAULT NULL  
);  
  
insert into emp values (10,'KING',5000);  
insert into emp values (10,'CLARK',2450);  
insert into emp values (10,'MILLER',1300);  
insert into emp values (20,'SCOTT',3000);  
insert into emp values (20,'FORD',3000);  
insert into emp values (20,'JONES',2975);  
insert into emp values (20,'ADAMS',1100);  
insert into emp values (20,'SMITH',800);  
insert into emp values (30,'BLAKE',2850);  
insert into emp values (30,'ALLEN',1600);  
insert into emp values (30,'TURNER',1500);  
insert into emp values (30,'WARD',1250);  
insert into emp values (30,'MARTIN',1250);  
insert into emp values (30,'JAMES',950);  
 
1.row_number() 的使用
 
原表信息:
Java代码  
select deptno, ename, sal from emp order by deptno, sal desc;  
 
Java代码  
    DEPTNO  ENAME   SAL  
1   10  KING    5000  
2   10  CLARK   2450  
3   10  MILLER  1300  
4   20  SCOTT   3000  
5   20  FORD    3000  
6   20  JONES   2975  
7   20  ADAMS   1100  
8   20  SMITH   800  
9   30  BLAKE   2850  
10  30  ALLEN   1600  
11  30  TURNER  1500  
12  30  WARD    1250  
13  30  MARTIN  1250  
14  30  JAMES   950  
 使用row_number()查出各部门薪水最高的三个员工姓名、薪水,多于三个的只取三个。
Java代码  
    DEPTNO  RW  ENAME   SAL  
1   10  1   KING    5000  
2   10  2   CLARK   2450  
3   10  3   MILLER  1300  
4   20  1   SCOTT   3000  
5   20  2   FORD    3000  
6   20  3   JONES   2975  
7   30  1   BLAKE   2850  
8   30  2   ALLEN   1600  
9   30  3   TURNER  1500  
 体会:row_number() 返回的主要是“行”的信息,并没有按照sal排名,如
        20          1 SCOTT            3000
                    2 FORD             3000
scott与ford薪水一样多,ford前面的2仅仅是行数、记录条数的感念。
 
2.rank()、dense_rank() 的使用
 
使用rank()查出各部门薪水前三名的员工姓名、薪水。
 
Java代码  
select *  
  from (select deptno,  
               rank() over(partition by deptno order by sal desc) rk,  
               ename,  
               sal  
          from emp)  
 where rk <= 3  
 
Java代码  
    DEPTNO  RK  ENAME   SAL  
1   10  1   KING    5000  
2   10  2   CLARK   2450  
3   10  3   MILLER  1300  
4   20  1   SCOTT   3000  
5   20  1   FORD    3000  
6   20  3   JONES   2975  
7   30  1   BLAKE   2850  
8   30  2   ALLEN   1600  
9   30  3   TURNER  1500  
 
使用dense_rank()查出各部门薪水前三名的员工姓名、薪水。
 
Java代码  
select *  
  from (select deptno,  
               dense_rank() over(partition by deptno order by sal desc) drk,  
               ename,  
               sal  
          from emp)  
 where drk <= 3  
 
 
Java代码  
    DEPTNO  DRK ENAME   SAL  
1   10  1   KING    5000  
2   10  2   CLARK   2450  
3   10  3   MILLER  1300  
4   20  1   SCOTT   3000  
5   20  1   FORD    3000  
6   20  2   JONES   2975  
7   20  3   ADAMS   1100  
8   30  1   BLAKE   2850  
9   30  2   ALLEN   1600  
10  30  3   TURNER  1500  
 Oracle统计函数(一)--Rank和Dense_Rank
分类:Oracle数据库
聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。
在9i版本之前,只有分析功能(analytic ),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。
其语法为:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。
其语法为:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)
 
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,