目录

一、小案例:

school表中有①id 序号②class 班级 ③score成绩 三个字段, 使用oracle实现按照班级分区,然后取班级中的第一名。

1.1测试数据如下:

--创建学校表school

create table school(

id varchar2(10) primary key, --序号

class varchar2(10), --班级

score NUMBER --分数

);

--插入几条数据

insert into school (id, CLASS, SROCE) values ('1', '一班', 93);

insert into school (id, CLASS, SROCE) values ('2', '一班', 93);

insert into school (id, CLASS, SROCE) values ('3', '一班', 92);

insert into school (id, CLASS, SROCE) values ('4', '一班', 81);

insert into school (id, CLASS, SROCE) values ('5', '二班', 99);

insert into school (id, CLASS, SROCE) values ('6', '二班', 99);

insert into school (id, CLASS, SROCE) values ('7', '二班', 92);

insert into school (id, CLASS, SROCE) values ('8', '二班', 83);

1.2使用over(partition by)函数实现小案例中的SQL

select *

from (select t.id,

t.class,

t.sroce,

rank() over(partition by t.class order by t.sroce desc) n

from school t)

where n = 1;

二、知识扩展

简介:

Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

2.1 over(partition by)函数的写法

over(partition by class order by sroce) 先按照class分区,再按照sroce排序,order by是个默认的开窗函数。

2.2 与over(partition by)函数结合的函数的介绍

row_number() over(partition by ... order by ...):返回分组排序后的顺序

rank() over(partition by ... order by ...):返回分组排序后的排名(并列第一名的情况下返回:第一名,第一名,第三名)

dense_rank() over(partition by ... order by ...):返回分组排序后的排名(并列第一名的情况下返回:第一名,第一名,第二名)

count(A) over(partition by ... order by ...):返回分组排序后的总数。

max(A) over(partition by ... order by ...):返回分组排序后的最大值。

min(A) over(partition by ... order by ...):返回分组排序后的最小值。

avg(A) over(partition by ... order by ...):返回分组排序后的平均值。

sum(A) over(partition by ... order by ...):返回分组排序后的累加求和。

lag(A,1) over(partition by ... order by ...):取出上一列的A的值放到本列中。

lead(A,1) over(partition by ... order by ...):取出下一列的A的值放到本列中。

ratio_to_report(A) over(partition by B) 返回分组后的A在其分区B内的占比,A就是分子,B分的组就是分母

2.2.1 rank() 与over(partition by ... order by ...)组合函数

公式:

rank() over(partition by A order by B) --按照A分区,按照B排序

根据小案例中数据,使用rank()函数 按照班级分区,然后取班级中的第一名

select *

from (select t.id 序号,

t.class 班级,

t.sroce 成绩,

rank() over(partition by t.class order by t.sroce desc) n返回值

from school t)

--where n = 1

;

结果:对分区间内的查询的记录排名,如下图,有两个并列第一的情况,则有两个第一名,然后是第三名,所以二班为一个区间 返回1,1,3,4 ;一班为一个区间返回1,1,3,4

2.2.2 row_number() 与over(partition by ... order by ...)组合函数

公式

row_number() over(partition by A order by B) --按照A分区,按照B排序

根据小案例中数据,使用row_number()函数 按照班级分区,然后取班级中的第一名

select *

from (select t.id 序号,

t.class 班级,

t.sroce 成绩,

row_number() over(partition by t.class order by t.sroce desc) n返回值

from school t)

--where n = 1

;

结果:简单的说row_number()从1开始,为每一条分区中的记录返回一个数字,如下图中二班为一个区间 返回1,2,3,4 ;一班为一个区间返回1,2,3,4

2.2.3 关于rank() 和row_number()的总结

综合上述案例,row_number():适用于将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询,

比如查询前10个 查询10-100个学生。

rank()        :可以理解为 排名函数,在求第一名成绩的时候,如果同班有两个并列第一,rank()返回两个结果。

Oracle取排序的第五条数据,OVER(PARTITION BY)函数介绍 【oracle中按A分组按B排序,再取B中第一条数据的查询】...相关推荐

  1. OVER(PARTITION BY)函数介绍(oracle数据库)

    问题场景 最近在项目中遇到了对每一个类型进行求和并且求该类型所占的比例,当时考虑求出每种类型的和,并在java中分别对每一种类型的和与总和相除求出所占比例.后来,想到这样有点麻烦,并且项目中持久层使用 ...

  2. oracle分组查询取第一条数据,160804、oracle查询:取出每组中的第一条记录

    oracle查询:取出每组中的第一条记录 按type字段分组,code排序,取出每组中的第一条记录 方法一: select type,min(code) from group_info group b ...

  3. mysql分组取出每组地一条数据_MYSQL实现分组排序并取组内第一条数据

    一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( sel ...

  4. oracle 取分组第一行,oracle分组后取每组第一条数据

    oracle 分组后取每组第一条数据 '数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER ...

  5. MYSQL实现分组排序并取组内第一条数据

    一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from (sele ...

  6. oracle 取1条记录,oracle 获取第一条数据

    关于取第一条数据的sql特此作了一个例子如下: http://www.360doc.com/showweb/0/0/860281883.aspxSELECT * FROM tableName wher ...

  7. oracle排序后获取第一条数据

    首先想说下,其实很简单的 select * from (select * from testStudent order by id desc) where rownum=1; 看上面的sql语句 先执 ...

  8. Group By 分组并取第一条数据

    MYSQL GROUP BY mysql  我使用排序进行筛选,保证分组.排序之后我的第一条数据就是我要的数据 SELECT a.code , a.type AS 班型 ,MAX(a.num) FRO ...

  9. oracle寻找第一条数据,oracle 获取第一条数据

    关于取第一条数据的sql特此作了一个例子如下: SELECT * FROM tableName where fd_rt = 'A' --and rownum=1 ORDER BY fd_date DE ...

最新文章

  1. Android Dialog 弹框之外的区域 默认透明背景色修改
  2. 除了java还学什么_学好Java编程除了努力还需要具备什么?
  3. 如何一小时杀入天池OCR比赛前排?
  4. juniper srx 出口负载均衡_直流微电网负载均流控制的新策略
  5. python开发微信小程序-微信小程序开发:python+sanic 实现小程序登录注册
  6. OD汇编指令集(不断更新)
  7. RPA机器人来了, 你的饭碗还好吗?
  8. java制作图形界面数据库_java图形界面以及链接数据库
  9. c3p0连接错误 An attempt by a client to checkout a Connection has timed out.
  10. 三维曲面图像绘制(光照控制)
  11. C语言入门——适合练手的密码本项目
  12. matlab仿真界面设计,基于MATLAB图形用户界面GUI的电路仿真实验的制作
  13. CPA七--应交增值税(转载)
  14. 2014年3月份全国计算机等级考试二级c语言选择题大全,2014年3月全国计算机二级C选择题考试真题...
  15. 搭建Web服务器建网站的步骤
  16. 数据库MySQL入门-下
  17. 有哪些值得推荐的计算机专业的竞赛?
  18. OPC-(一)-什么是OPC
  19. 嵌入式OCR+RFID识别电子护照阅读器模块MRZ码电子证件识别模组的应用与攻略
  20. 最佳情侣身高差 (10 分)

热门文章

  1. 梅科尔工作室——鸿蒙设备开发实战004:内核开发
  2. STM32F407--芯片解读
  3. 速记计算机键盘,键盘字母排列的速记公式
  4. 企业微信公众号运营引流的三大法宝
  5. 图解三代测序(SMRT Sequencing)
  6. 案例-canvas绘制雨滴
  7. UnityShader 表面着色器简单例程集合
  8. SolidPlant材料清单
  9. 程序人生—谈安全测试的重要性
  10. Cisco Packet Tracer 超网(CIDR)设置实验