聚合函数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. sql查询出现1055 this is incompatible with sql_mode=only_full_group_by

    今天在测试服务器上突然出现了这么一个MySQL的问题,同样的代码正式服没有问题,那肯定就是出在了配置上,查了一下原因才明白原来是数据库版本为5.7以上的版本, 默认是开启了 only_full_gro ...

  2. 3.JVM 垃圾收集器

    Garbage Collect(垃圾回收) 1.1 如何确定一个对象是垃圾? 要想进行垃圾回收,得先知道什么样的对象是垃圾. 1.1.1 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用, ...

  3. 深入浅出JVM(一):运行时数据区域

    程序计数器 线程私有 指向了正在执行的虚拟机字节码指令的地址:如果是本地方法,数值为空 没有 OutOfMemoryError 错误的区域 Java虚拟机栈 线程私有: 生命周期与线程相同: 代表着 ...

  4. Eclipse访问外部网站(比如:CSDN首页)

    其实这个感觉没什么用,毕竟我们都有浏览器,而且浏览器界面还比较宽,方便.只是好奇.所以记录一下.效果如下: 有两种方法,方法一是永久的,方法二是一次性的. 方法一(永久): 1.在工具栏找" ...

  5. Nginx限制访问速率和最大并发连接数模块--limit (防范DDOS攻击)

    Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/document_cn/http_limit_req_cn ...

  6. ultraedit 实际应用技巧

    Tip 1: Alt+C 列模式可以说最初选择使用这个文本编辑软件,原因很简单,就是因为“她”具有列编辑模式.如果您还不知道什么是列编辑模式的话,我想您应该好好研究一下啦.这是一个超级“赞”的功能.在 ...

  7. Java CPU占用过高问题排查,windows和Linux

    LINUX系统: linux系统比较简单: 1.使用命令 ps -ef | grep 找出异常java进程的pid.  找出pid为 20189 2. top -H -p 20189,所有该进程的线程 ...

  8. 聊聊 ES6 中的箭头函数

    首先来两点: 当只有一个参数的时候,那么 () 可以省略 当只有一个 return 的时候,那么 {} 可以省略 当函数体内只有一条语句的时候,那么 {} 也可以省略 下面来几个简单的例子来对比 ES ...

  9. JavaScript之控制标签内容

    function abb(a){ return document.getElementById(a); } console.log(abb('box').innerHTML); 标签.innerHTM ...

  10. 在safari下input的placeholder设置行高失效

    在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font- ...