分享好友 最新动态首页 最新动态分类 切换频道
转载oracle排序排名写法
2024-12-27 09:59

(1)rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。 
(2)dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。
(3)row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。
(4)ntile是要把查询得到的结果平均分为几组,如果不平均则分给第一组。

转载oracle排序排名写法

例如

create table s_score
(   s_id number(6)
   ,score number(4,2)
);
insert into s_score values(001,98);
insert into s_score values(002,66.5);
insert into s_score values(003,99);
insert into s_score values(004,98);
insert into s_score values(005,98);
insert into s_score values(006,80);

select
    s_id 
   ,score
   ,rank() over(order by score desc) rank               --按照成绩排名,纯排名
   ,dense_rank() over(order by score desc) dense_rank   --按照成绩排名,相同成绩排名一致
   ,row_number() over(order by score desc) row_number   --按照成绩依次排名
   ,ntile(3) over (order by score desc) group_s         --按照分数划分成绩梯队
from s_score;

排名/排序的时候,有时候,我们会想到利用伪列row_num,利用row_num确实可以解决某些场景下的问题(但是相对也比较复杂),而且有些场景下的问题却很难解决。

例:取成绩前三名,并且前三名含有并列的情况。通过上面例子,我们可以直观的看到,结果应该有5条记录

select
    s_id 
   ,score
   ,dense_rank
from (
select
    s_id 
   ,score
   ,rank() over(order by score desc) rank
   ,dense_rank() over(order by score desc) dense_rank
   ,row_number() over(order by score desc) row_number
from s_score
) t
where dense_rank <= 3;

   S_ID  SCORE DENSE_RANK
------- ------ ----------
      3  99.00          1
      1  98.00          2
      5  98.00          2
      4  98.00          2
      6  80.00          3
      

如果只是简单的想到去用rownum <= 3 得到的结果显然不可能是正确的。

组内的排名或者排序是经常遇到的一种场景。
例如,取每个销售部门内,销售业绩最好的前三名。取每个班级内成绩排名信息等等..
取每个班级内每门课成绩排名第一的同学信息

drop table S_SCORE;
create table S_SCORE
(
  S_ID  NUMBER(6),
  CLASS_ID VARCHAR2(2),
  COURSE VARCHAR2(20),
  SCORE NUMBER(5,2)
);

INSERT INTO S_SCORE VALUES(1001,'A','MATH','67');
INSERT INTO S_SCORE VALUES(1004,'B','MATH','88');
INSERT INTO S_SCORE VALUES(1002,'A','MATH','99');
INSERT INTO S_SCORE VALUES(1003,'A','MATH','55');
INSERT INTO S_SCORE VALUES(1001,'B','MATH','88');
INSERT INTO S_SCORE VALUES(1001,'B','MATH','70');
INSERT INTO S_SCORE VALUES(1001,'A','ORACLE','97');
INSERT INTO S_SCORE VALUES(1004,'B','ORACLE','48');
INSERT INTO S_SCORE VALUES(1002,'A','ORACLE','79');
INSERT INTO S_SCORE VALUES(1003,'A','ORACLE','65');
INSERT INTO S_SCORE VALUES(1001,'B','ORACLE','82');
INSERT INTO S_SCORE VALUES(1001,'B','ORACLE','78');

select
   s_id
  ,class_id
  ,course
  ,score
  ,dense_rank() over (partition by class_id,course order by score desc) drk
from S_SCORE;

   S_ID CLASS_ID COURSE                 SCORE        DRK
------- -------- -------------------- ------- ----------
   1002 A        MATH                   99.00          1
   1001 A        MATH                   67.00          2
   1003 A        MATH                   55.00          3
   1001 A        ORACLE                 97.00          1
   1002 A        ORACLE                 79.00          2
   1003 A        ORACLE                 65.00          3
   1004 B        MATH                   88.00          1
   1001 B        MATH                   88.00          1
   1001 B        MATH                   70.00          2
   1001 B        ORACLE                 82.00          1
   1001 B        ORACLE                 78.00          2
   1004 B        ORACLE                 48.00          3
   
select
   s_id
  ,class_id
  ,course
  ,score
from (
select
   s_id
  ,class_id
  ,course
  ,score
  ,dense_rank() over (partition by class_id,course order by score desc) drk
from S_SCORE
) t
where drk = 1;


   S_ID CLASS_ID COURSE                 SCORE
------- -------- -------------------- -------
   1002 A        MATH                   99.00
   1001 A        ORACLE                 97.00
   1004 B        MATH                   88.00
   1001 B        MATH                   88.00
   1001 B        ORACLE                 82.00   

rank()和dense_rank()用法相似,这里就不在举例说明了。可以将上面的例子中dense_rank()替换成rank()实现。

接下来,看一个使用row_number()的场景
例:查看每个部门最近一笔销售记录

select * from criss_sales order by dept_id,sale_date desc;

DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT
------- ----------- ---------- -----------
D01     2014/5/4    G02                 80
D01     2014/4/30   G03                800
D01     2014/4/8    G01                200
D01     2014/3/4    G00                700
D02     2014/5/2    G03                900
D02     2014/4/27   G01                300
D02     2014/4/8    G02                100
D02     2014/3/6    G00                500

即,我们希望得到这两条记录

D01     2014/5/4    G02                 80
D02     2014/5/2    G03                900

select
  dept_id
 ,sale_date
 ,goods_type
 ,sale_cnt
 ,row_number() over (partition by dept_id order by sale_date desc)
from criss_sales;

DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT ROW_NUMBER()OVER(PARTITIONBYDE
------- ----------- ---------- ----------- ------------------------------
D01     2014/5/4    G02                 80                              1
D01     2014/4/30   G03                800                              2
D01     2014/4/8    G01                200                              3
D01     2014/3/4    G00                700                              4
D02     2014/5/2    G03                900                              1
D02     2014/4/27   G01                300                              2
D02     2014/4/8    G02                100                              3
D02     2014/3/6    G00                500                              4

select
  dept_id
 ,sale_date
 ,goods_type
 ,sale_cnt
from (
select
  dept_id
 ,sale_date
 ,goods_type
 ,sale_cnt
 ,row_number() over (partition by dept_id order by sale_date desc) rn
from criss_sales
) t
where rn = 1;

DEPT_ID SALE_DATE   GOODS_TYPE    SALE_CNT
------- ----------- ---------- -----------
D01     2014/5/4    G02                 80
D02     2014/5/2    G03                900

 

有时会有这样的需求:如果数据排序后分为三部分,业务人员只关心其中的一部分,如何将这中间的三分之一数据拿出来呢?
这时比较好的选择,就是使用ntile函数

select
      dept_id
     ,sale_date
     ,goods_type
     ,sale_cnt
     ,ntile(3) over (order by sale_cnt desc nulls last)  all_cmp
     ,ntile(3) over (partition by dept_id order by sale_cnt desc nulls last) all_dept
from criss_sales;

最新文章
最准一码一肖100%凤凰网释义与警惕犯罪行为的深入探讨
在当今社会,随着互联网的普及和科技的飞速发展,各种信息充斥在我们的日常生活中。“最准一码一肖100%凤凰网”这样的关键词组合,时常出现在人们的视野中,这样的信息背后往往隐藏着复杂的问题,需要我们深入解析并警惕其中可能存在的违法
百度seo排名优化助手介绍
百度SEO排名优化助手是一款针对百度搜索引擎的优化工具,旨在帮助企业或个人提高网站在百度搜索结果页(SERP)的排名和曝光率。以下是对百度SEO排名优化助手的详细介绍:一、主要功能关键词研究与推荐根据企业的需求和目标,提供关键词研究
直播热潮来袭,朋友圈如何巧妙发布?快来一起探索!
直播封面和标题是吸引观众的第一道门槛。因此,要精心制作直播封面和标题,让它们醒目、吸引人。可以使用一些有趣的图片、文字或者动态效果来制作封面,让观众一眼就能被吸引。同时,标题也要简洁明了、有吸引力,能够概括直播内容或者引起
Ubuntu14.04中使用docker容器部署tomcat镜像+java web项目
一、部署tomcat1、Ctrl+Alt +t打开命令2、获取root权限:3、输入密码4、创建文件夹tomcat7,命令如,并且切换到该目录下:5、在tomcat7文件夹下,创建Dockerfile6、编辑Dockerfile7、完成以下命令编写8、用如下命令构建镜像9、如下命令会运
麒麟处理器排行榜天梯图解析:性能对比与选购指南
简介:在智能手机和电脑市场中,处理器的性能直接影响到设备的使用体验。麒麟处理器作为华为自家研发的芯片,凭借其强大的性能和高效的能耗管理,逐渐成为市场上的一匹黑马。本文将通过麒麟处理器排行榜天梯图,解析不同型号的性能对比,并
班级优化大师旧版本
班级优化大师旧版本是一款方便老师们进行管理的app,平台对于老师们来说方便进行学生的管理,在平台上可以一键收发作业,并且能够将对作业的点评直接发送到学生端口,让学生们能够对自己的作业完成情况一目了然,在这里还有着许多的课后练
高清美女写真神器推荐:AI绘画工具一键生成我的虚拟女友!
Midjourney:这一工具因其生成的艺术性而受到青睐。用户只需要在Discord上输入简短描述,即可获得高质量的图片。其们生成方式较为个性化,适合艺术创作者。而价格策略上,Midjourney需要订阅使用,这对于预算有限的用户来说会是一个考量点
高效关键词撰写指南,优化推广关键词策略全解析
本文提供高效率关键词撰写指南,从关键词研究、优化、分析和调整等方面,详细介绍如何优化推广关键词,提升搜索引擎排名,吸引更多潜在客户。通过掌握关键词撰写技巧,实现精准营销,提高企业品牌知名度。随着互联网的快速发展,企业纷纷投
中国外贸出口产品排名前十排行榜
在全球化的浪潮中,中国的外贸出口产品以其独特的魅力和卓越的品质赢得了世界的广泛认可。今天,带您走进中国外贸出口产品的世界,一起探索那些在榜单上名列前茅的璀璨明珠。作为全球知名的智能手机品牌,华为Mate系列手机凭借其卓越的性能
UAndroidTool刷机神器下载 v4.4.8 免费无限制破解版
UAndroidTool破解版是一款可以适配市面上大部分安卓手机型号的专业刷机软件,我们不仅可以使用UAndroidTool刷机神器来对手机进行一键刷机,更换自己喜欢的系统。同时这款软件还是救砖神器,能够解决刷机过程中不小心变成板砖的问题!UAndro
相关文章
推荐文章
发表评论
0评