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

  • 2013年02月20日 15:46
  • 72KB
  • 下载

Oracle row_number() over()解析函数高效实现分页

1. Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。 分页查询格式(有order by ---三层sql): SELECT * FROM ( SELECT A.*,...

oracle分析函数row_number() over()使用

http://cbf0713.blog.163.com/blog/static/9077890520102591928645/ row_number() over ([partiti...
  • lzhat
  • lzhat
  • 2017年02月28日 10:41
  • 189

oracle分析函数row_number() over()使用(2)

很好的一个文章,来自http://apps.hi.baidu.com/share/detail/21843741; 由于图片无法引用,不过SQL可以直接运行的。row_number() over ([...
  • zftang
  • zftang
  • 2011年07月10日 00:27
  • 596

Oracle或者PostgreSQL的row_number over 排名语法

PostgreSQL 和Oracle 都提供了 row_number() over() 这样的语句来进行对应的字段排名, 很是方便。  MySQL却没有提供这样的语法。  这次我提供的表结构如下...

oracle中常用函数ROW_NUMBER() OVER()(分析函数)

ROW_NUMBER() OVER()函数

oracle分析函数row_number() over()使用

row_number() over ([partition by col1] order by col2) ) as 别名 表示根据col1分组,在分组内部根据 col2排序 而这个“别名”的值就...
  • xys_777
  • xys_777
  • 2011年11月16日 15:46
  • 564

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

三个分组函数都是按照col1分组内从1开始排序,区别在于: row_number() 是没有重复值的排序(即使两天记录相等也是不重复的) dense_rank() 是连续排序,两个第二名仍然跟着第三名...

oracle中rownum和row_number()over()的区别

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内...

浅谈oracle中row_number() over()分析函数用法

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内...
  • rong_wz
  • rong_wz
  • 2013年07月17日 10:49
  • 536
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle的 row_number() over()应用
举报原因:
原因补充:

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