Oracle排名函数(Rank)实例详解

   2015-07-13 0
核心提示:这篇文章主要介绍了Oracle排名函数(Rank)实例详解,需要的朋友可以参考下

--已知:两种排名方式(分区和不分区):使用和不使用partition

--两种计算方式(连续,不连续),对应函数:dense_rank,rank

·查询原始数据:学号,姓名,科目名,成绩

select * from t_score

S_ID
S_NAME
SUB_NAME
SCORE
1
张三
语文
80.00
2
李四
数学
80.00
1
张三
数学
0.00
2
李四
语文
50.00
3
张三丰
语文
10.00
3
张三丰
数学
 
3
张三丰
体育
120.00
4
杨过
JAVA
90.00
5
mike
c++
80.00
3
张三丰
Oracle
0.00
4
杨过
Oracle
77.00
2
李四
Oracle
77.00

·查询各学生科目为Oracle排名(简单排名)
select sc.s_id,sc.s_name,sub_name,sc.score,
rank() over (order by score desc) 名次
from t_score sc
where sub_name='Oracle'

S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1
3
张三丰
Oracle
0.00
3

对比:rank()与dense_rank():非连续排名与连续排名(都是简单排名)
select sc.s_id,sc.s_name,sub_name,sc.score,
dense_rank() over (order by score desc) 名次
from t_score sc
where sub_name='Oracle'

S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1
3
张三丰
Oracle
0.00
2

·查询各学生各科排名(分区排名)
select sc.s_id,sc.s_name,sub_name,sc.score,
rank() over
(partition by sub_name order by score desc) 名次
from t_score sc

S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
JAVA
90.00
1
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1
3
张三丰
Oracle
0.00
3
5
mike
c++
80.00
1
3
张三丰
数学
 
1
2
李四
数学
80.00
2
1
张三
数学
0.00
3
3
张三丰
体育
120.00
1
1
张三
语文
80.00
1
2
李四
语文
50.00
2
3
张三丰
语文
10.00
3

·查询各科前2名(分区排名)

·类似:新闻表,求栏目点击率在前3位的新闻。
商品表,求各类别销售额在前10位的商品。

select * from (
select sc.s_id,sc.s_name,sub_name,sc.score,
dense_rank() over
(partition by sub_name order by score desc) 名次
from t_score sc
) x
where x.名次<=2

S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
JAVA
90.00
1
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1
3
张三丰
Oracle
0.00
2
5
mike
c++
80.00
1
3
张三丰
数学
 
1
2
李四
数学
80.00
2
3
张三丰
体育
120.00
1
1
张三
语文
80.00
1
2
李四
语文
50.00
2

·查询各同学总分
select s_id,s_name,sum(score) sum_score from t_score
group by s_id,s_name

S_ID
S_NAME
SUM_SCORE
1
张三
80.00
2
李四
207.00
3
张三丰
130.00
4
杨过
167.00
5
mike
80.00

·根据总分查询各同学名次
select x.*,
rank() over (order by sum_score desc) 名次
from (
select s_id,s_name,sum(score) sum_score from t_score
group by s_id,s_name ) x

S_ID
S_NAME
SUM_SCORE
名次
2
李四
207.00
1
4
杨过
167.00
2
3
张三丰
130.00
3
1
张三
80.00
4
5
mike
80.00
4

语法:
rank() over (order by 排序字段 顺序)
rank() over (partition by 分组字段 order by 排序字段 顺序)
1.顺序:asc|desc 名次与业务相关:
示例:找求优秀学员:成绩:降序 迟到次数:升序
2.分区字段:根据什么字段进行分区。
问题:分区与分组有什么区别
·分区只是将原始数据进行名次排列(记录数不变),
·分组是对原始数据进行聚合统计(记录数变少,每组返回一条),注意:聚合。

脚本:

create table t_score
(
 autoid number primary key,
 s_id  number(3),
 s_name char(8) not null,
 sub_name varchar2(20),
 score number(10,2)
);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (8, 1, '张三 ', '语文', 80);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (9, 2, '李四 ', '数学', 80);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (10, 1, '张三 ', '数学', 0);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (11, 2, '李四 ', '语文', 50);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (12, 3, '张三丰 ', '语文', 10);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (13, 3, '张三丰 ', '数学', null);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (14, 3, '张三丰 ', '体育', 120);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (15, 4, '杨过 ', 'java', 90);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (16, 5, 'mike ', 'c++', 80);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (3, 3, '张三丰 ', 'oracle', 0);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (4, 4, '杨过 ', 'oracle', 77);
insert into t_score (autoid, s_id, s_name, sub_name, score)
values (17, 2, '李四 ', 'oracle', 77);
commit;
 
标签: Oracle 排名函数
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 去重复的sql(Oracle) 去重复的英文
    1.利用group by 去重复2.可以利用下面的sql去重复,如下  1) select id,name,sex from (select a.*,row_number() over(partition by a.id,a.set order by name) su from test a ) where su=1  2)select id,name,sex from (select a.*,row_number() over(p
    02-10
  • Oracle SQL七次提速技巧
    以下SQL执行时间按序号递减。1,动态SQL,没有绑定变量,每次执行都做硬解析操作,占用较大的共享池空间,若共享池空间不足,会导致其他SQL语句的解析信息被挤出共享池。create or replace procedure proc1as beginfor i in 1..100000 loop    execute imme
    02-10
  • Oracle\SQL  Server等及其他基本语句写法
    Oracle\SQL Server等及其他基本语句写法
    Oracle\SQL  Server等及其他基本语句写法目录一.Excel相关 11.Excel中写脚本范例: 12.提取字节 23. 提取单元格内字符 24.VLOOKUP函数: 2二.SQL语句汇总 21.建表: 22.增 33.删 44.查 65.改 236.Alter的应用 24三.数据库备份与恢复脚本 261. Oracle: 2
    02-10
  • SQL ORACLE case when函数用法
    case when 用法(1)简单case函数:格式:  case 列名   when 条件值1 then 选项1  when 条件值1 then 选项2......  else 默认值 end例如:  select   case job_level  when '1' then '1111'  when '2' then '2222'   when '3' then '3333
    02-10
  • Oracle迁移到MySQL性能下降的注意点 oracle数据
    背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障。在我的记忆里面淘宝最初从Oracle迁移到MySQL期间也遇到了很多SQL的性能问题,记忆最为深刻的子查询,当初的
    02-10
  • ORACLE中通过SQL语句(alter table)来增加、删除
    1.添加字段:alter table  表名  add (字段  字段类型)  [ default  '输入默认值']  [null/not null]  ;2.添加备注:comment on column  库名.表名.字段名 is  '输入的备注';  如: 我要在ers_data库中  test表 document_type字段添加备注  comm
    02-10
  • MySQL与Oracle 差异比较之六触发器
    触发器编号类别ORACLEMYSQL注释1创建触发器语句不同create or replace trigger TG_ES_FAC_UNIT  before insert or update or delete on ES_FAC_UNIT  for each rowcreate trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT` BEFORE INSERT on `hs_esbs`.`es_fac_u
    02-10
  • Oracle的HINT可以强制指定SQL的执行计划,比如
    在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 :  select table_name from user_tables;  //当前用户的表 select table_name from all_tables;  //所有用户的表 select table_name from dba_tables;  //包
    02-10
  • Oracle sql 子字符串长度判断
    Oracle sql 子字符串长度判断 select t.* from d_table t WHEREsubstr(t.col,1,1)='8' and instr(t.col,'/')0 and length(substr(t.col,1,instr(t.col,'/')))5; 字符串的前两位都是数字:select * from d_table t WHERE regexp_like(substr(t.col,1,2), '^[
    02-10
  • Oracle、MySql、Sql Server比对
    MySql:廉价(部分免费):当前,MySQL採用双重授权(DualLicensed),他们是GPL和MySQLAB制定的商业许可协议。假设你在一个遵循GPL的***(开源)项目中使用MySQL,那么你能够遵循GPL协议免费使用MySQL。否则,你须要购买MySQLAB制定的那个商业许可协议。Windows $
    02-10
点击排行