- RANK函数的语法描述
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions123.htm#i1269223
RANK( )
OVER ([ query_partition_clause ] order_by_clause)
- 有关分析函数的扩展可以参考Oracle的官方文档中的“Analytic Functions”描述:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm#SQLRF06174
- 通过实验看一下RANK函数的使用方法
-- 创建测试表T,并初始化9条数据
create table t (group_id number(10), name varchar2(10), salary int);
insert into t values (1,'Tom',1200);
insert into t values (2,'Kary',2400);
insert into t values (2,'Joe',800);
insert into t values (3,'Erick',3600);
insert into t values (3,'Andy',600);
insert into t values (3,'Secooler',600);
insert into t values (3,'Hou',600);
insert into t values (3,'Mary',300);
insert into t values (3,'Ellen',200);
commit;
-- T表全貌
-- 共三组数据,group_id分别是1、2和3。第1组有一个人,第2组有两个人,第3组有六个人。最后一列是每个人的薪水值,注意第三组中的Andy、Secooler和Hou的薪水都是相同的
select * from t;
GROUP_ID NAME SALARY
---------- ------------------------------ ----------
1 Tom 1200
2 Kary 2400
2 Joe 800
3 Erick 3600
3 Andy 600
3 Secooler 600
3 Hou 600
3 Mary 300
3 Ellen 200
9 rows selected.
-- 分析函数RANK的基本使用方法
select group_id, name, salary, rank() over (PARTITION BY group_id ORDER BY salary) as rank from t;
GROUP_ID NAME SALARY RANK
---------- ------------------------------ ---------- ----------
1 Tom 1200 1
2 Joe 800 1
2 Kary 2400 2
3 Ellen 200 1
3 Mary 300 2
3 Hou 600 3
3 Secooler 600 3
3 Andy 600 3
3 Erick 3600 6
9 rows selected.
-- 可见,在数据的最后一列我们添加了RANK列,这一列可以得到每一分组人员薪酬从低到高的序号。重点请关注同组内薪酬相同的人,如Andy、Secooler和Hou,他们在第三组中的RANK都是3,紧跟其后的Erick的RANK突然变成了6,这是序号跳跃现象(以后我会给大家介绍分析函数DENSE_RANK,它就不会出现这种跳跃现象)
-- 分析函数RANK的一般使用场合
--- 类似于分析函数ROW_NUMBER的作用,可以得到每组内的前N条或后N条记录,便于数据的查询与分析
--- 与ROW_NUMBER不同的是,分析函数RANK在遇到同组内值相同的记录时,将会使用相同的数字进行标识,以示数值的相等
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions123.htm#i1269223
RANK( )
OVER ([ query_partition_clause ] order_by_clause)
- 有关分析函数的扩展可以参考Oracle的官方文档中的“Analytic Functions”描述:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm#SQLRF06174
- 通过实验看一下RANK函数的使用方法
-- 创建测试表T,并初始化9条数据
create table t (group_id number(10), name varchar2(10), salary int);
insert into t values (1,'Tom',1200);
insert into t values (2,'Kary',2400);
insert into t values (2,'Joe',800);
insert into t values (3,'Erick',3600);
insert into t values (3,'Andy',600);
insert into t values (3,'Secooler',600);
insert into t values (3,'Hou',600);
insert into t values (3,'Mary',300);
insert into t values (3,'Ellen',200);
commit;
-- T表全貌
-- 共三组数据,group_id分别是1、2和3。第1组有一个人,第2组有两个人,第3组有六个人。最后一列是每个人的薪水值,注意第三组中的Andy、Secooler和Hou的薪水都是相同的
select * from t;
GROUP_ID NAME SALARY
---------- ------------------------------ ----------
1 Tom 1200
2 Kary 2400
2 Joe 800
3 Erick 3600
3 Andy 600
3 Secooler 600
3 Hou 600
3 Mary 300
3 Ellen 200
9 rows selected.
-- 分析函数RANK的基本使用方法
select group_id, name, salary, rank() over (PARTITION BY group_id ORDER BY salary) as rank from t;
GROUP_ID NAME SALARY RANK
---------- ------------------------------ ---------- ----------
1 Tom 1200 1
2 Joe 800 1
2 Kary 2400 2
3 Ellen 200 1
3 Mary 300 2
3 Hou 600 3
3 Secooler 600 3
3 Andy 600 3
3 Erick 3600 6
9 rows selected.
-- 可见,在数据的最后一列我们添加了RANK列,这一列可以得到每一分组人员薪酬从低到高的序号。重点请关注同组内薪酬相同的人,如Andy、Secooler和Hou,他们在第三组中的RANK都是3,紧跟其后的Erick的RANK突然变成了6,这是序号跳跃现象(以后我会给大家介绍分析函数DENSE_RANK,它就不会出现这种跳跃现象)
-- 分析函数RANK的一般使用场合
--- 类似于分析函数ROW_NUMBER的作用,可以得到每组内的前N条或后N条记录,便于数据的查询与分析
--- 与ROW_NUMBER不同的是,分析函数RANK在遇到同组内值相同的记录时,将会使用相同的数字进行标识,以示数值的相等
0 件のコメント:
コメントを投稿