`

Oracle函数Rank Over Partition使用实例详解(一)

阅读更多

Rank()使用说明:

 

a. 函数简介:

    返回结果集分区内指定字段的值的排名,指定字段的值的排名是相关行之前的排名加一。

b. 语法:

    RANK() OVER([<partiton_by_clause>]<order by clause>)

c. 参数说明:

    partition_by_clause 将from子句生成的结果集划分为应用到RANK函数的分区。

    Order_by_clause确定将RANK值应用到分区中的行时所使用的顺序。

 

d. 以下是实例使用:

 

 

1. 创建测试表

 

--创建表
-- Create table
create table T_SCORE
(
  AUTOID   NUMBER not null,
  S_ID     NUMBER(3),
  S_NAME   CHAR(8) not null,
  SUB_NAME VARCHAR2(20),
  SCORE    NUMBER(10,2)
);
-- Add comments to the table 
comment on table T_SCORE
  is '学生成绩表';
-- Add comments to the columns 
comment on column T_SCORE.AUTOID
  is '主键ID';
comment on column T_SCORE.S_ID
  is '学生ID';
comment on column T_SCORE.S_NAME
  is '学生姓名';
comment on column T_SCORE.SUB_NAME
  is '科目';
comment on column T_SCORE.SCORE
  is '成绩';

 

2. 创建测试记录

 

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (8, 1, '张三    ', '语文', 80.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (9, 2, '李四    ', '数学', 80.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (10, 1, '张三    ', '数学', 0.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (11, 2, '李四    ', '语文', 50.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (12, 3, '张三丰  ', '语文', 10.00);

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.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (15, 4, '杨过    ', 'JAVA', 90.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (16, 5, 'mike    ', 'c++', 80.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (3, 3, '张三丰  ', 'Oracle', 0.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (4, 4, '杨过    ', 'Oracle', 77.00);

insert into t_score (AUTOID, S_ID, S_NAME, SUB_NAME, SCORE)
values (17, 2, '李四    ', 'Oracle', 77.00);

 

3. 分不同情况查询

3.1 查询所有的学生成绩

 

--1.查询所有的学生成绩
select t.s_id 学号, t.s_name 姓名, t.sub_name 科目, t.score 成绩
  from t_score t;

查询结果:

学号 姓名 科目 成绩
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

 

3.2 查询Oracle科目成绩名次-非连续rank

--2.查询Oracle科目成绩名次-非连续rank
select t.s_id 学号,
       t.s_name 姓名,
       t.sub_name 科目,
       t.score 成绩,
       rank() over(order by score desc nulls last) 名次
  from t_score t
 where t.sub_name = 'Oracle';

 查询结果:

学号 姓名 科目 成绩 名次
4 杨过     Oracle 77.00 1
2 李四     Oracle 77.00 1
3 张三丰   Oracle 0.00 3

 

3.3查询Oracle科目成绩名次-连续dense_rank

--3.查询Oracle科目成绩名次-连续dense_rank
select t.s_id 学号,
       t.s_name 姓名,
       t.sub_name 科目,
       t.score 成绩,
       dense_rank() over(order by score desc nulls last) 名次
  from t_score t
 where t.sub_name = 'Oracle';

 查询结果:

 

学号 姓名 科目 成绩 名次
4 杨过     Oracle 77.00 1
2 李四     Oracle 77.00 1
3 张三丰   Oracle 0.00 2

 

3.4 查询各学生各科排名

--4.查询各学生各科排名
select t.s_id 学号,
       t.s_name 姓名,
       t.sub_name 科目,
       t.score 成绩,
       dense_rank() over(partition by t.s_name order by score desc nulls last) 名次
  from t_score t;

 查询结果:

 

学号 姓名 科目 成绩 名次
5 mike     c++ 80.00 1
2 李四     数学 80.00 1
2 李四     Oracle 77.00 2
2 李四     语文 50.00 3
4 杨过     JAVA 90.00 1
4 杨过     Oracle 77.00 2
1 张三     语文 80.00 1
1 张三     数学 0.00 2
3 张三丰   体育 120.00 1
3 张三丰   语文 10.00 2
3 张三丰   Oracle 0.00 3
3 张三丰   数学
4

 

3.5 查询各科名次(分区)

--5.查询各科名次(分区)
select t.s_id 学号,
       t.s_name 姓名,
       t.sub_name 科目,
       t.score 成绩,
       dense_rank() over(partition by t.sub_name order by score desc nulls last) 名次
  from t_score t;

 查询结果:

 

学号 姓名 科目 成绩 名次
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
2 李四     数学 80.00 1
1 张三     数学 0.00 2
3 张三丰   数学
3
3 张三丰   体育 120.00 1
1 张三     语文 80.00 1
2 李四     语文 50.00 2
3 张三丰   语文 10.00 3

 

分享到:
评论

相关推荐

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载)

    ### Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数详解 #### 一、OVER (PARTITION BY ..) 概述 在Oracle数据库中,`OVER (PARTITION BY ...)` 是一种非常强大的功能,它允许用户在数据集上进行窗口操作。这在...

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

    在本实例中,我们将详细探讨Oracle中的Rank()函数及其使用方法。 Rank()函数的基本用法是在`OVER()`子句中,通过指定`ORDER BY`来决定排名依据。其语法如下: ```sql rank() over (order by 排序字段 [asc|desc]) ...

    Oracle开发的over函数

    ### Oracle开发中的OVER函数详解 #### 一、Oracle分析函数简介 在Oracle数据库开发中,分析函数是一类非常强大的工具,主要用于实现复杂的查询需求,尤其是在处理大量数据时,能够提供高级的数据汇总、排序和筛选...

    oracle_排列rank()函数

    在Oracle数据库中,`RANK()`函数是一种窗口函数,它被用于在一组数据中为每一行分配一个唯一的排名。此函数特别适用于需要基于特定条件对数据进行排序并为每个记录分配一个名次的情况。在本篇文章中,我们将深入探讨...

    Ooracle 分析函数的使用实例

    ### Oracle分析函数详解与应用实例 #### 引言 Oracle分析函数自Oracle 8i版本引入以来,为数据库用户提供了强大的数据分析能力。相比于传统的自联接、子查询或存储过程等复杂操作,分析函数能够以更简洁、高效的...

    Oracle 分析函数

    ### Oracle分析函数详解 #### 一、Oracle分析函数简介 Oracle分析函数是在Oracle数据库中用于处理复杂的查询需求的一组强大的工具。与传统的SQL聚合函数(如`SUM`, `AVG`, `COUNT`等)不同,分析函数能够在同一...

    oracle分析函数

    ### Oracle分析函数详解 #### 一、Oracle分析函数概述 Oracle分析函数,也称为窗口函数,是一种高级查询技术,主要用于处理复杂的数据分析需求,尤其是在OLAP(在线分析处理)场景中,它们能够对数据进行多层次的...

    Oracle分析函数

    ### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对数据进行复杂的查询和分析操作,这些操作远远超出了传统SQL的功能。与聚合函数不同,分析函数可以为每一组返回多行结果,这...

    Oracle表中重复数据去重的方法实例详解

    本文将深入探讨Oracle表中如何有效地去除重复数据,通过实例详细解析这一过程。 首先,我们需要理解什么是重复数据。在数据库中,重复数据指的是具有相同值的一组记录。这可能是由于数据输入错误、合并不同数据源...

    oracle row_number用法

    ### Oracle Row_Number 函数详解 #### 一、Row_Number 基础概念 在Oracle数据库中,`ROW_NUMBER()`函数是一种窗口函数,主要用于为查询结果中的每一行分配一个唯一的序列号。这一特性使得它在处理分组数据时非常...

    Beginning Oracle SQL

    ### Oracle SQL基础知识详解 #### 一、书籍简介与目标读者 《Beginning Oracle SQL》是一本由Lex de Haan、Tim Gorman、Karen Morton、Daniel Fink和Inger Jorgensen共同编写的关于Oracle SQL的基础教程。该书由...

Global site tag (gtag.js) - Google Analytics