聚合函数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 }]]...

参考栗子三。

语法

【语法】

rank() over( [query_partition_clause] order_by_clause )
dense_rank() over( [query_partition_clause] order_by_clause )

【功能】聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。

【参数】dense_rank与rank()用法相当

【区别】dence_rank在并列关系是,相关等级不会跳过。rank则跳过.

rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) 
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。


rank()

栗子1

表xgj:

--建表
create table XGJ
(
col1 NUMBER,
col2 NUMBER
)
--插入数据
insert into xgj (COL1, COL2)
values (1, 1); insert into xgj (COL1, COL2)
values (2, 1); insert into xgj (COL1, COL2)
values (3, 2); insert into xgj (COL1, COL2)
values (3, 1); insert into xgj (COL1, COL2)
values (4, 1); insert into xgj (COL1, COL2)
values (4, 2); insert into xgj (COL1, COL2)
values (5, 2); insert into xgj (COL1, COL2)
values (5, 2); insert into xgj (COL1, COL2)
values (6, 2);
--提交数据
commit;

数据规格如下:

分析功能:列出Col2分组后根据Col1排序,并生成数字列.

比较实用于在成绩表中查出各科前几名的信息。

SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM xgj a;


栗子2

TABLE:xgj_2 (分数 ,科目)
   create table xgj_2
(
score NUMBER,
subject VARCHAR2(20)
)
insert into xgj_2(SCORE, SUBJECT)
values (80, '数学'); insert into xgj_2(SCORE, SUBJECT)
values (70, '语文'); insert into xgj_2(SCORE, SUBJECT)
values (90, '数学'); insert into xgj_2(SCORE, SUBJECT)
values (60, '数学'); insert into xgj_2(SCORE, SUBJECT)
values (100, '数学'); insert into xgj_2(SCORE, SUBJECT)
values (88, '语文'); insert into xgj_2(SCORE, SUBJECT)
values (65, '语文'); insert into xgj_2(SCORE, SUBJECT)
values (77, '语文'); commit;

数据规格如下: 

现在我想要的结果是:(即想要每门科目的前3名的分数)

   数学,100
  数学,90
  数学,80
  语文,88
  语文,77
  语文,70
SQL:

select *
from (select rank() over(partition by a.subject order by a.score desc) rk,
a.*
from xgj_2 a) t
where t.rk <= 3;


栗子3

拿第二个栗子的表 作为数据源。

合计功能:计算出数值(65,’语文’)在Orade By score ,subject排序下的排序值,也就是score=65,subject=语文在排序以后的位置

SELECT RANK(65,'语文') WITHIN GROUP (ORDER BY score  ,subject ) "Rank" FROM  xgj_2;

结果如下: 
 


dense_rank()

dense_rank与rank()用法相当,但是有一个区别:dence_rank在并列关系是,相关等级不会跳过。rank则跳过.

栗子1

表xgj_3 数据规格:

  A      B      C
  a     liu     wang
  a     jin     shu
  a     cai     kai
  b     yang     du
  b     lin     ying
  b     yao     cai
  b     yang     99
  
  例如:当rank时为:  select m.a,m.b,m.c,rank() over(partition by a order by b) RK from xgj_3 m
  
   A     B       C     RK
   a     cai      kai     1
   a     jin      shu     2
   a     liu      wang     3
   b     lin      ying     1
   b     yang     du      2
   b     yang     99      2
   b     yao      cai     4
  
  而如果用dense_rank时为:  select m.a,m.b,m.c,dense_rank() over(partition by a order by b) RK from xgj_3 m
  
   A     B       C     RK
   a     cai     kai     1
   a     jin     shu     2
   a     liu     wang     3
   b     lin     ying     1
   b     yang     du      2
   b     yang     99      2
   b     yao     cai     3

Oracle-分析函数之排序值rank()和dense_rank()的更多相关文章

  1. Oracle 排序分析函数之ROW_NUMBER、RANK和DENSE_RANK

    我们都知道分析函数功能很强大,可能需要写很复杂的标准SQL才能办到或不可能办到的事,使用分析函数却能很容易完成.我们经常会用到排序分析函数,如ROW_NUMBER,RANK,DENSE_RANK.这三 ...

  2. oracle 分组中排序(rank函数)

    需求: 查询每个供应商在每个类型产品销售的top50中有多少 分析: 1.查询,以指定字段(供应商.产品类型)分组,取每个分组的前50行,查看每个供应商的数量 2.使用rank函数给每个供应商.每个类 ...

  3. Oracle分析函数-排序排列(rank、dense_rank、row_number、ntile)

    (1)rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名. (2)dense_rank函数返回一个唯一的值, ...

  4. [转]oracle分析函数Rank, Dense_rank, row_number

    oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 ==================== ...

  5. oracle分析函数Rank, Dense_rank, row_number

    http://www.cnblogs.com/wuyisky/archive/2010/02/24/oracle_rank.html 目录=============================== ...

  6. Oracle分析函数 — rank, dense_rank, row_number用法

    本文通过例子演示了Oracle分析函数 —— rank, dense_rank, row_number的用法. //首先建score表 create table score( course   nva ...

  7. Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...

  8. mssql sqlserver 分组排序函数row_number、rank、dense_rank用法简介及说明

    在实际的项目开发中,我们经常使用分组函数,对组内数据进行群组后,然后进行组内排序:如:1:取出一个客户一段时间内,最大订单数的行记录2: 取出一个客户一段时间内,最后一次销售记录的行记录——————— ...

  9. Oracle中rank() over, dense_rank(), row_number() 的区别

    摘自:http://www.linuxidc.com/Linux/2015-04/116349.htm Oracle 中 rank() over, dense_rank(), row_number() ...

随机推荐

  1. 重回ubutntu12.04小记(装完ubuntu做的几件事)

    原来一直是在windows下用虚拟机跑redhat 和debian 做实验和一些工程,以前也装过ubuntu和windows双系统,但是换电脑后,就一直懒得捣鼓了. 现在,由于长期需要在linux上做 ...

  2. IDEA修改Servlet的代码生成模板

    file--->settings,打开settings面板

  3. 《Redis Mysql 双写一致性问题》

    一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)-  先更新数据库,后更新 ...

  4. 【C++札记】函数重载

    概述 函数重载指在相同作用域中多个函数名相同,函数的形参不同. 遵循规则: 1.函数名相同 2.函数的参数,类型,个数或顺序不一样都可以构成重载. 3.函数返回值得类型不同不构成重载,编译直接报错,存 ...

  5. linux初识1

    linux 操作系统 概念性的理解 1.Linux内置解释器bash 相当于pyhon解释器 2.Linux的内部大多是使用python去书写 云计算 1.只需要 花钱,买腾讯,阿里云服务器 2.专人 ...

  6. Linux 环境安装 Node、nginx、docker、vsftpd、gitlab

    Linux 环境安装 centos7 # 更新yum yum update -y 0. 防火墙 firewalld 新入的JD云服务器,发现防火墙默认是关闭的. # 查看防火墙状态 systemctl ...

  7. 从docker中备份oracle和mongo数据

    从docker中导出Oracle数据 这里推荐先把脚本文件放到容器里面(这里没有) #!/bin/sh # 进入容器 # 本机备份位置 /root/oracleData/dist/temp # 当前日 ...

  8. int and Integer

    int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...

  9. Spark 系列(十二)—— Spark SQL JOIN 操作

    一. 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据.分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark = SparkSessio ...

  10. NEST explain

    Elasticsearch 的相似度算法 被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容: 检索词频率 检索词在该字段出现的频率?出现频率越高,相关性也越高. 字段中出现过 5 次要 ...