oracle的 row_number() over()应用

原创 2015年11月19日 13:51:56

最近在开发中遇到了一个问题,有一个课程表,和一个专业表,课程表和专业表示多对多的关系,即一个专业可能包含多个课程,一个课程也可能属于多个专业,如下图所示:KCH(课程号)--ZYH(专业号)


那么现在要求查出这张表中的所有不重复的课程号(kch),如果这个课程号(kch)对应多个专业号,那么就根据专业号排序,取第一条数据,

在这种情况下就需要用到row_number() over()这个分析函数,语法如下:

ROW_NUMBER() OVER(partition by col1 order by col2)

解释:意思是说将查询结果根据COL1分组然后根据COL2排序,然后将每个分组结果都会生成一个从1.....n 的序列号,注意是为每个分组生成而不是   为整个查询结果生成序列号。

………这道了这些就可以对以上的问题进行解决,根据课程号(kch)分组,然后根据专业号(zyh)进行排序sql语句如下:

select t1.*,row_number() over(partition by t1.kch ORDER BY zyh) cn from table1 t1

查询结果如下图所示:


可以看出,现在已经为每个分组都生成了从1.......N的一个序列号,那么现在为了最终解决问题,就可以用这个查询结果作为子查询来进一步达成我们的目的sql语句如下:

SELECT z1.kch,z1.zyh,z1.cn FROM (
select t1.*,row_number() over(partition by t1.kch ORDER BY zyh) cn from DZYKM_ALL t1) z1
WHERE z1.cn = 1

查询结果如下图:


这样就达成了开始我们的目的,个人觉得这个函数最好用的地方就是:1.可以根据某个字段进行分组而根据其他的字段进行排序,这个是group by……order by……所做不到的;2.可以为每个分组的n条数据生成一个从1......n排序号,可以用作筛选条件

版权声明:本文为博主原创文章,未经博主允许不得转载。

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,...
  • iw1210
  • iw1210
  • 2013年09月23日 16:39
  • 54538

Oracle数据库 row_number() over() 函数使用说明

row_number() over(partition by COLUMN_NAME1 order by COLUMN_NAME2 DESC)  含义:从1开始,为每一条分组记录返回一个数字 ...
  • shuaishifu
  • shuaishifu
  • 2014年08月08日 16:09
  • 3717

oracle 中的 ROW_NUMBER() OVER() 函数

 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序, 而此函数计算的值就表示每组内部排序后...
  • zhengjingyu810
  • zhengjingyu810
  • 2016年08月30日 17:57
  • 687

oracle 的 row_number over 去除重复数据

SELECT * FROM (select   Row_number() OVER (PARTITION BY a1 ORDER BY a1) rn  from a  ) where RN = 1...
  • yali1990515
  • yali1990515
  • 2016年03月25日 22:19
  • 1138

mysql实现oracle 分析函数row_number()over()

需求:对分组内的流水记录进行排序 这里根据日期进行排序 代码如下: SELECT b.app_no,                b.payment_date,                b.f...
  • adosea
  • adosea
  • 2016年05月20日 10:05
  • 387

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

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

Oracle使用row_number() over (partition order by)和DISTINCT去除重复记录

最近做的一个模块涉及到8张表的联合查询,由于这8张表中有很多主从表的关联,结果在使用模糊查询的时候查询结果集出现了重复记录。如下:                                   ...
  • zjx86320
  • zjx86320
  • 2015年11月10日 11:12
  • 4252

MySQL 实现Oracle或者PostgreSQL的row_number over 这样的排名语法

MySQL 的row_number() over() 实现。
  • yueliangdao0608
  • yueliangdao0608
  • 2014年01月10日 16:49
  • 7496

Oracle 中实例详解ROW_NUMBER()用法

ROW_NUMBER()语法如下: 1、row_number() over(order by column desc)先对列column按照降序,再为每条记录返回一个序列号: SELECT D...
  • liqingan880102
  • liqingan880102
  • 2013年08月12日 14:25
  • 1744

使用Oracle的row_number() over函数过滤重复数据,取最新的记录

问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL, 每个设备每天都会产生一条检测信息,现在需要从该表中检索出每个设备的最新检测信息。也就是device_id字段不能重复,消除devic...
  • lu7kang
  • lu7kang
  • 2010年08月27日 00:11
  • 3398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle的 row_number() over()应用
举报原因:
原因补充:

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