- DENSE_RANK函数的语法描述
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions043.htm#SQLRF00633
DENSE_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
- 通过实验看一下DENSE_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.
-- 分析函数DENSE_RANK的基本使用方法
-- DENSE_RANK函数与RANK函数相同点是,当同组的薪水值相同时DENSE_RANK的值相同;不同点是,DENSE_RANK不会出现RANK函数的跳跃现象
select group_id, name, salary, dense_rank() over (PARTITION BY group_id ORDER BY salary) as dense_rank from t;
GROUP_ID NAME SALARY DENSE_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 4
9 rows selected.
-- 同时使用row_number、rank和dense_rank函数,比较一下他们的区别
col rn for 99
col rank for 99
col dense_rank for 99
select group_id, name, salary, row_number() over (PARTITION BY group_id ORDER BY salary) as rn, rank() over (PARTITION BY group_id ORDER BY salary) as rank, dense_rank() over (PARTITION BY group_id ORDER BY salary) as dense_rank from t;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Hou 600 3 3 3
3 Secooler 600 4 3 3
3 Andy 600 5 3 3
3 Erick 3600 6 6 4
9 rows selected.
-- 上面的结果清晰的表明了ROW_NUMBER、RANK和DENSE_RANK的区别。在获取前N条记录和后N条记录的需求里各有使用场合
-- 使用ROW_NUMBER取每组的前四
select *
from (select GROUP_ID,
name,
salary,
ROW_NUMBER () over (partition by GROUP_ID order by salary)
as rn,
RANK () over (partition by GROUP_ID order by salary) as RANK,
DENSE_RANK () over (partition by GROUP_ID order by salary)
as DENSE_RANK
from t)
where rn <= 4;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Andy 600 3 3 3
3 Hou 600 4 3 3
7 rows selected.
-- 使用RANK取每组的前四
select *
from (select GROUP_ID,
name,
salary,
ROW_NUMBER () over (partition by GROUP_ID order by salary)
as rn,
RANK () over (partition by GROUP_ID order by salary) as RANK,
DENSE_RANK () over (partition by GROUP_ID order by salary)
as DENSE_RANK
from t)
where RANK <= 4;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Andy 600 3 3 3
3 Hou 600 4 3 3
3 Secooler 600 5 3 3
8 rows selected.
-- 使用DENSE_RANK取每组的前四
select *
from (select GROUP_ID,
name,
salary,
ROW_NUMBER () over (partition by GROUP_ID order by salary)
as rn,
RANK () over (partition by GROUP_ID order by salary) as RANK,
DENSE_RANK () over (partition by GROUP_ID order by salary)
as DENSE_RANK
from t)
where DENSE_RANK <= 4;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Andy 600 3 3 3
3 Hou 600 4 3 3
3 Secooler 600 5 3 3
3 Erick 3600 6 6 4
9 rows selected.
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions043.htm#SQLRF00633
DENSE_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
- 通过实验看一下DENSE_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.
-- 分析函数DENSE_RANK的基本使用方法
-- DENSE_RANK函数与RANK函数相同点是,当同组的薪水值相同时DENSE_RANK的值相同;不同点是,DENSE_RANK不会出现RANK函数的跳跃现象
select group_id, name, salary, dense_rank() over (PARTITION BY group_id ORDER BY salary) as dense_rank from t;
GROUP_ID NAME SALARY DENSE_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 4
9 rows selected.
-- 同时使用row_number、rank和dense_rank函数,比较一下他们的区别
col rn for 99
col rank for 99
col dense_rank for 99
select group_id, name, salary, row_number() over (PARTITION BY group_id ORDER BY salary) as rn, rank() over (PARTITION BY group_id ORDER BY salary) as rank, dense_rank() over (PARTITION BY group_id ORDER BY salary) as dense_rank from t;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Hou 600 3 3 3
3 Secooler 600 4 3 3
3 Andy 600 5 3 3
3 Erick 3600 6 6 4
9 rows selected.
-- 上面的结果清晰的表明了ROW_NUMBER、RANK和DENSE_RANK的区别。在获取前N条记录和后N条记录的需求里各有使用场合
-- 使用ROW_NUMBER取每组的前四
select *
from (select GROUP_ID,
name,
salary,
ROW_NUMBER () over (partition by GROUP_ID order by salary)
as rn,
RANK () over (partition by GROUP_ID order by salary) as RANK,
DENSE_RANK () over (partition by GROUP_ID order by salary)
as DENSE_RANK
from t)
where rn <= 4;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Andy 600 3 3 3
3 Hou 600 4 3 3
7 rows selected.
-- 使用RANK取每组的前四
select *
from (select GROUP_ID,
name,
salary,
ROW_NUMBER () over (partition by GROUP_ID order by salary)
as rn,
RANK () over (partition by GROUP_ID order by salary) as RANK,
DENSE_RANK () over (partition by GROUP_ID order by salary)
as DENSE_RANK
from t)
where RANK <= 4;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Andy 600 3 3 3
3 Hou 600 4 3 3
3 Secooler 600 5 3 3
8 rows selected.
-- 使用DENSE_RANK取每组的前四
select *
from (select GROUP_ID,
name,
salary,
ROW_NUMBER () over (partition by GROUP_ID order by salary)
as rn,
RANK () over (partition by GROUP_ID order by salary) as RANK,
DENSE_RANK () over (partition by GROUP_ID order by salary)
as DENSE_RANK
from t)
where DENSE_RANK <= 4;
GROUP_ID NAME SALARY RN RANK DENSE_RANK
---------- ------------------------------ ---------- --- ---- ----------
1 Tom 1200 1 1 1
2 Joe 800 1 1 1
2 Kary 2400 2 2 2
3 Ellen 200 1 1 1
3 Mary 300 2 2 2
3 Andy 600 3 3 3
3 Hou 600 4 3 3
3 Secooler 600 5 3 3
3 Erick 3600 6 6 4
9 rows selected.
0 件のコメント:
コメントを投稿