rank()与dense_rank()的分析

翻译 2013年12月03日 15:49:43

1.rank()分析函数

语法:
RANK() OVER([PARTITION BY expr1[,expr2,..,exprn]] ORDER BY expr1[,expr2,..,exprn])

   功能:                                                                                                                                            先将记录按PARTITION分组,组内再以ORDER BY排序,算出当前记录在组内所处的级别(名次). PRATITION条件省略时,表明不分组,或将全录记录作为一组

例子: 有表如下:

SQL> select * from test;

NAME       SUBJECT         SCORE
---------- ---------- ----------
aa         chinese            90
aa         art                     88
aa         english            80
bb         chinese            80
bb         art                     92
bb         english            96
cc         chinese            73
cc         art                      78
cc         english            60

已选择9行。

执行语句如下:

SQL> break on name skip 1;
SQL> select * from ( select name ,subject,score ,rank() over ( partition by name order by score desc)
 score_rank  from  test)  where score_rank<=3;

NAME       SUBJECT         SCORE SCORE_RANK
---------- ---------- ---------- ----------
aa         chinese            90          1
                 art                88          2
           english            80          3

bb         english            96          1
                 art                92          2
           chinese            80          3

cc            art                78          1
           chinese            73          2
           english            60          3

已选择9行。

 

SQL> select * from (select name ,subject,score ,rank() over ( partition by subject order by score desc) score_rank from test) where score_rank<=3;

NAME       SUBJECT         SCORE SCORE_RANK
---------- ---------- ---------- ----------
bb         art                92          1
aa                            88          2
cc                            78          3

aa         chinese     90          1
bb                            80          2
cc                            73          3

bb         english     96          1
aa                            80          2
cc                            60          3

已选择9行。

2.dense_rank函数

DENSE_RANK分析函数

语法:DENSE_RANK() OVER([PARTITION BY expr1[,expr2,..,exprn]] ORDER BY expr1[,expr2,..,exprn])

 


SQL> insert into test values('dd','chinese',80);

已创建 1 行。

SQL> insert into test values('dd','art',78);

已创建 1 行。

SQL> insert into test values('dd','english',96);

已创建 1 行。

SQL> select * from (select name ,subject,score,dense_rank() over ( partition by subject order by score desc) score_rank from test) where score_rank<=3;



NAME       SUBJECT         SCORE SCORE_RANK
---------- ---------- ---------- ----------
dd         art                96          1
bb                            92          2
aa                            88          3
aa         chinese            90          1
bb                            80          2
cc                            73          3
bb         english            96          1
aa                            80          2
cc                            60          3

已选择9行。

SQL>  select * from (select name ,subject,score ,dense_rank() over ( partition by name order by score desc) score_rank from test) where score_rank<=3;

NAME       SUBJECT         SCORE SCORE_RANK
---------- ---------- ---------- ----------
aa         chinese            90          1
aa         art                     88          2
aa         english            80          3
bb                                 96          1
bb         art                    92          2
bb         chinese            80          3
cc         art                     78          1
cc         chinese            73          2
cc         english            60          3
dd         art                   96          1
dd                               80          2
dd                               78          3

已选择12行。

SQL> select * from (select name ,subject,score,rank() over ( partition by name order by score desc)
score_rank from test) where score_rank<=3;

NAME       SUBJECT         SCORE SCORE_RANK
---------- ---------- ---------- ----------
aa         chinese            90          1
aa         art                     88          2
aa         english            80          3
bb                                  96          1
bb         art                      92          2
bb         chinese            80          3
cc         art                      78          1
cc         chinese            73          2
cc         english            60          3
dd         art                96          1
dd                            80          2
dd                            78          3

已选择12行。

SQL> select * from (select name ,subject,score,rank() over ( partition by subject order by score desc) score_rank from test) where score_rank<=3;

NAME       SUBJECT         SCORE SCORE_RANK
---------- ---------- ---------- ----------
dd         art                96          1
bb                            92          2
aa                            88          3
aa         chinese      90          1
bb                            80          2
cc                            73          3
bb         english       96          1
aa                            80          2
cc                            60          3

已选择9行。

RANK、DENSE_RANK以及ROW_NUMBER区别

场景 数据库查询中,很多时候都会遇到对数据进行分组,然后组内排序加序号的需求。 应用 对于组内排序一般有三个函数可供使用,它们是RANK()、DENSE_RANK()以及ROW_NUMBER()。它们...
  • hustzw07
  • hustzw07
  • 2016年04月20日 16:54
  • 1226

Oracle rank和dense_rank排名函数

1.rank函数 rank计算一组值的排名,返回数字类型。排名可能是不连续。如果有5人,其中有2个人排名第一,则rank返回的排名结果为:1 1 3 4 5。 作为一个聚合函数,返回虚拟行在样...
  • chiclewu
  • chiclewu
  • 2013年12月10日 23:49
  • 6519

Hive分析窗口函数之NTILE,ROW_NUMBER,RANK和DENSE_RANK

继续介绍几个序列函数: NTILE,ROW_NUMBER,RANK和DENSE_RANK 环境信息: Hive版本为apache-hive-0.14.0-bin Hadoop版本为hadoop-2...
  • jiangshouzhuang
  • jiangshouzhuang
  • 2016年04月04日 16:34
  • 1943

MySQL 下 ROW_NUMBER / DENSE_RANK / RANK 的实现

来自:http://blog.sina.com.cn/s/blog_562b10b901011c17.html CREATE TABLE test_rownum ( ID int, Ke CHAR...
  • Bryan__
  • Bryan__
  • 2016年05月01日 17:07
  • 2749

SQL中ROW_NUMBER()/RANK() /DENSE_RANK() OVER函数的基本用法

转自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html
  • biaobiao1217
  • biaobiao1217
  • 2014年11月13日 13:20
  • 2658

oracle中rank() over, dense_rank(), row_number() 的区别

假设现在有一张学生表student,学生表中有姓名、分数、课程编号,现在我需要按照课程对学生的成绩进行排序。 select * from student 1. rank over ()可以实现对...
  • zdp072
  • zdp072
  • 2015年04月16日 15:01
  • 1351

一个SQL语句分清楚RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同

在SCOTT用户下,执行下面SQL; SELECT  s.deptno,s.ename,s.sal, RANK() over(partition by s.deptno order by s.sa...
  • S630730701
  • S630730701
  • 2016年07月14日 00:21
  • 6125

hive的row_number()、rank()和dense_rank()的区别以及具体使用

row_number()、rank()和dense_rank()这三个是hive内置的分析函数,下面我们来看看他们的区别和具体的使用案例。 首先创建一个文件test: A,1 B,3 C,2 D,3 ...
  • qq_20641565
  • qq_20641565
  • 2016年10月17日 20:05
  • 2783

postgresql rank() over, dense_rank(), row_number() 的区别

引原文如下学生表student,学生表中有姓名、分数、课程编号,需要按照课程对学生的成绩进行排序select * from jinbo.student; id | name | score | c...
  • u011944141
  • u011944141
  • 2017年12月29日 02:54
  • 198

oracle中聚合函数RANK和dense_rank的使用

                                       聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。在9i版本之前,只有分析功能(analyt...
  • precipitant
  • precipitant
  • 2005年08月03日 15:21
  • 1819
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:rank()与dense_rank()的分析
举报原因:
原因补充:

(最多只允许输入30个字)